给定以下表结构

images                 data
 ------------------    ----------------------------------
| id    | filename |  | fromImageId | toImageId | result |
 ------------------    ----------------------------------


我有以下SELECT来获取在images.filename中没有条目的所有datafromImageIdtoImageId

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.idPRIMARY KEYfromImageIdtoImageId都是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分别将它们从图像值连接到图像值。因此,现在,它应该完全跳过并仅踢出“数据”表都找不到匹配项的那些条目。

10-07 12:10
查看更多