给定以下表结构
images data
------------------ ----------------------------------
| id | filename | | fromImageId | toImageId | result |
------------------ ----------------------------------
我有以下
SELECT
来获取在images.filename
中没有条目的所有data
(fromImageId
或toImageId
)SELECT image.id, image.filename
FROM images image
WHERE NOT EXISTS(
SELECT fromImageId, toImageId
FROM data results
WHERE fromImageId = image.id
OR toImageId = image.id
) ORDER BY image.id
由于
data
表非常大(500,000+),因此此查询需要很长的时间来计算(大约10-15秒)。我非常确定要在此处进行很多优化,但是我无法完全理解如何优化查询。
PS:
images.id
是PRIMARY KEY
,fromImageId
和toImageId
都是FOREIGN KEY
上的images.id
最佳答案
确保您的“数据”表至少有两个索引...一个仅在FROM图像ID上,另一个在To Image ID上。然后,与迈克尔的提议略有不同
select STRAIGHT_JOIN
i.ID,
i.FileName
from
Images i
LEFT JOIN Data d1
on i.ID = d1.FromImageID
LEFT JOIN Data d2
on i.ID = d2.ToImageID
where
d1.FromImageID is null
AND d2.ToImageID is null
使用两个单独的索引,此查询从您的图像文件开始,并与您的数据表的两个版本排成一行……在同一时间,EITHER分别将它们从图像值连接到图像值。因此,现在,它应该完全跳过并仅踢出“数据”表都找不到匹配项的那些条目。