<分区>
我有两个表:all_ufo (U) 和 rights (R)。参见 ERD:
rights 是父表。 all_ufo 是 child 。
这是我的查询:
SELECT *
FROM all_ufo U
LEFT JOIN rights R
ON CASE
WHEN U.UPC IN (
SELECT DISTINCT UPC
FROM rights
WHERE UPC IS NOT NULL
AND Channels IS NULL)
THEN R.UPC
AND U.UPC = R.UPC
WHEN U.Artist IN (
SELECT DISTINCT Artist
FROM rights
WHERE Artist IS NOT NULL
AND Channels IS NULL)
THEN R.Artist
AND U.Artist = R.Artist
WHEN U.Label IN (
SELECT DISTINCT Label
FROM rights
WHERE Label IS NOT NULL
AND Channels IS NULL)
THEN R.Label
AND U.Label = R.Label
END
;
rights 表有点奇怪:它有 3 个级别的契约(Contract),我想将 all_ufo 中的每个行项目匹配到一个且只有一个契约(Contract)。
查询在 R 中为 U 中的每一行(有一行的地方)查找匹配项,从 UPC 开始,然后是 Artist,然后是 Label。
这是 R 表的示例。这里有一行代表表中的每一种条目(NULL 值在这里显示为字符串“NULL”,但在数据库中它们实际上是 null):
这是来自 U 的 20 条随机线的样本:
在我的示例数据(20 行)中,我得到了预期的结果。但是当我在整个表(大约 60 万行)上运行它时,它会运行一个小时左右然后终止。
我还尝试将 R 表分成三个单独的表,每个表对应一种类型的契约(Contract)。这是我试过的 MySQL 脚本,由于不正确的 SQL (?) 而失败了:
SELECT *
FROM all_ufo U
CASE
WHEN U.UPC IN (
SELECT DISTINCT UPC
FROM Contracts_Release
WHERE Channels IS NULL)
THEN LEFT JOIN Contracts_Release R
ON (U.UPC = R.UPC
AND R.ContractLevel = 'ReleaseLevel')
WHEN U.Artist IN (
SELECT DISTINCT Artist
FROM Contracts_Artist
WHERE Channels IS NULL)
THEN LEFT JOIN Contracts_Artist R
ON U.Artist = R.Artist
AND R.ContractLevel = 'ArtistLevel'
WHEN U.Label IN (
SELECT DISTINCT Label
FROM Contracts_Label
WHERE Channels IS NULL)
THEN LEFT JOIN Contracts_Label R
ON U.Label = R.Label
AND R.ContractLevel = 'LabelLevel'
END
;
我从来没有学过很多关于索引、数据库调优、查询优化等的知识。但是我已经尝试过这个没有任何键的查询,两个表都有主键,索引基于单个列,索引基于多列。我没有尝试让该查询“正确”运行。
谁能告诉我这里的最佳方法?我已经在研究和试错之间交替了大约 5 天......