2010-11-08 15 views
0

OK, je ne peux pas trouver quel index je devrais avoir sur "TBL_PHOTOS" pour que cette requête s'exécute rapidement. Prend actuellement environ 0,8 secondes avec 50 000 lignes en PH, 50 000 en PL, 300 en R1 et 100 en R2.Impossible de déterminer l'index dont j'ai besoin pour cette requête mysql - merci de nous aider?

Si je supprime la clause ORDER BY, la requête est rapide, prenant < 0,05 secondes.

Voici MySQL par la voie:

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 

L'intention est de retirer les 100 photos mises en ligne récemment qui n'ont pas encore été liés à quoi que ce soit. TBL_RACES1 & TBL_RACES2 sont deux tables séparées pour une bonne raison, donc je ne peux pas changer ça. Une photo appartiendra toujours à une entité de R1 ou R2, jamais les deux.

Excuses si c'est un mauvais SQL pour une raison quelconque, ce n'est pas mon point fort. Je ne suis même pas sûr de l'information dont vous aurez besoin pour m'aider, alors si j'ai laissé quelque chose de vital, il suffit de demander.

J'ai quelques indices fixés sur la table déjà, mais dans une déclaration expliquer je reçois

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

Merci!

Répondre

0

Si la suppression de ORDER BY accélère considérablement la requête, le problème est dans le tri. Vous allez probablement extraire des milliers de lignes et ensuite prendre le top 100. Restructurez la requête afin d'extraire les 100 photos les plus récentes en premier, puis rejoignez les autres tables. Quelque chose comme ça (non testé):

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 

Je ne suis pas sur la syntaxe MySQL pour être sûr que ce soit la façon de l'exprimer dans MySQL, mais cela devrait vous donner l'idée générale.

+0

Merci, changeant à: SELECT Q.tTaken, Q.nPhotoPK, Q.sFilename DE (SELECT PH.tTaken, PH.nPhotoPK, PH.sFilename, PH.nRace1FK, PH.nRace2FK \t DE TBL_PHOTOS PH \t \t LEFT JOIN TBL_PHOTO_LINKS PL ON PH.nPhotoPK = PL.nPhotoFK \t OÙ PL.nPhotoLinkPK IS NULL \t \t ORDER BY DESC PH.nPhotoPK \t LIMIT 0,60) Q LEFT JOIN TBL_RACES R1 ON R1.nRacePK = Q.nRace1FK GAUCHE JOINDRE TBL_RACES R2 SUR R2.nRacePK = Q.nRace2FK semble avoir fait l'affaire. Est-ce le genre de chose que vous vouliez dire? – Codemonkey

+0

Est-ce que je manque quelque chose ici, ne peut pas comprendre comment coller/code de format \t dans \t cette case \t commentaires! – Codemonkey

+0

OK, cela n'a pas fonctionné entièrement, car j'avais allégé la question que je posais. Le plus gros problème était que j'avais "ORDER BY col1 ASC, col2 DESC". Je sais maintenant que MySQL * ne peut pas faire face à de telles choses, et j'ai dû créer une colonne "inverse" pour le contourner. Ordures! – Codemonkey