无法确定我需要哪个索引来进行这个mysql查询 - 请帮忙吗?

时间:2010-11-08 22:26:06

标签: mysql indexing

好的,我无法弄清楚我应该在“TBL_PHOTOS”上使用哪个索引来让这个查询快速运行。目前大约需要0.8秒,PH值为50,000行,PL为50,000行,R1为300行,R2为100行。

如果我删除了ORDER BY子句,那么查询速度很快,取<&lt; 0.05秒。

顺便提一句,以下是MySQL:

SELECT  PH.tTaken, PH.nPhotoPK, PH.sFilename

FROM TBL_PHOTOS PH
    LEFT JOIN TBL_PHOTO_LINKS PL ON PH.nPhotoPK = PL.nPhotoFK

    LEFT JOIN TBL_RACES1 R1 ON R1.nRacePK = PH.nRace1FK
    LEFT JOIN TBL_RACES2 R2 ON R2.nRacePK = PH.nRace2FK


WHERE PL.nPhotoLinkPK IS NULL

ORDER BY PH.tAdded DESC

LIMIT 0,100

目的是撤回最近上传的100张尚未与任何内容相关联的照片。 TBL_RACES1&amp; TBL_RACES2是两个独立的表,这是有充分理由的,所以我无法改变它。照片将始终属于R1 R2中的一个实体,而不是两者。

道歉,如果由于某种原因这是不好的SQL,这不是我的强项。我甚至不确定你需要哪些信息来帮助我,所以如果我留下了一些重要信息,那就问问。

我已经在表上设置了一些索引,但在解释声明中我得到了

possible_keys: (Null)
key: (null)
ref: (null)

谢谢!

1 个答案:

答案 0 :(得分:0)

如果删除ORDER BY会使查询运行得更快,那么问题在于排序。您可能会提取数千行,然后进入前100名。重新构建查询,以便首先提取最近的100张照片,然后加入其他表格。像这样(未经测试):

SELECT  tTaken, nPhotoPK, sFilename
FROM 
    (select * from TBL_PHOTOS order by tAdded DESC LIMIT 0,100) PH
    LEFT JOIN TBL_PHOTO_LINKS PL ON PH.nPhotoPK = PL.nPhotoFK
    LEFT JOIN TBL_RACES1 R1 ON R1.nRacePK = PH.nRace1FK
    LEFT JOIN TBL_RACES2 R2 ON R2.nRacePK = PH.nRace2FK
WHERE PL.nPhotoLinkPK IS NULL

我没有使用MySQL语法,以确保这是在MySQL中表达它的方式,但这应该给你一般的想法。