2010-11-08 19 views
0

好的,我無法確定我應該在「TBL_PHOTOS」上使用此查詢來快速運行的索引。目前PH值爲50,000行,PL爲50,000,R1爲300,R2爲100。找不到我需要這個mysql查詢的索引 - 請幫忙?

如果我刪除了ORDER BY子句,那麼查詢就會很快,需要花費< 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 & TBL_RACES2是一個很好的理由,兩個單獨的表,所以我不能改變這一點。照片將始終屬於R1 R2中的一個實體,從來都不屬於這兩個實體。

道歉,如果這是不好的SQL由於某種原因,這不是我的強項。我甚至不知道你需要哪些信息來幫助我,所以如果我留下了一些重要的問題,請問。

我必須設置該表已經幾個指標,但在解釋聲明,我得到

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

謝謝!

回答

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的方式,但是這應該給你的總體思路。

+0

謝謝你,將其更改爲: SELECT Q.tTaken,Q.nPhotoPK,Q.sFilename FROM (SELECT PH.tTaken,PH.nPhotoPK,PH.sFilename,PH.nRace1FK,PH.nRace2FK \t FROM TBL_PHOTOS PH \t \t LEFT JOIN TBL_PHOTO_LINKS PL ON PH.nPhotoPK = PL.nPhotoFK \t WHERE PL.nPhotoLinkPK IS NULL \t \t ORDER BY PH.nPhotoPK DESC \t LIMIT 0,60)問 LEFT JOIN TBL_RACES R1在R1.nRacePK上= Q.nRace1FK LEFT JOIN TBL_RACES R2 ON R2.nRacePK = Q.nRace2FK 似乎已經成功了。這就是你的意思? – Codemonkey 2010-11-08 22:41:53

+0

我在這裏錯過了什麼,不知道如何粘貼/格式代碼 \t in \t這個 \t評論框! – Codemonkey 2010-11-08 22:44:49

+0

好的,這並不完全正常,因爲我減少了我詢問的查詢。更大的問題是我有「ORDER BY col1 ASC,col2 DESC」。我現在知道MySQL *無法應付這種情況,而且我必須創建一個「反向」列才能解決這個問題。垃圾! – Codemonkey 2010-11-08 23:17:48