2010-02-19 5 views
7

Dernièrement, MySQL s'est accroché à des requêtes spécifiques. J'ai une table avec plus de 500 000 enregistrements. Voici la requête en cours d'exécution:MySQL Sorting Results prend beaucoup de temps

SELECT * FROM items OU (itemlist_id = 115626) ORDER BY TableOrder DESC LIMIT 1

est l'expliquer ici:

| 1 | SIMPLE | objets | TOUS | NULL | NULL | NULL | NULL | 587113 | En utilisant où; Utilisation de filesort |

Et voici l'entrée process_list:

| 252996 | racine | localhost | itemdb | Requête | 0 | Résultat de tri | SELECT * FROM items WHERE (itemlist_id = 115642) COMMANDE PAR tableOrder DESC LIMIT 1 |

Une idée de ce que cette requête pourrait prendre 10 minutes à traiter? Quand je le lance manuellement, c'est fait rapidement. (1 row in set (0.86 sec))

Merci

+1

Etes-vous sûr que le tri est lent et ne trouve pas l'enregistrement? Si vous avez une analyse de table de 500k + enregistrements sur un champ qui n'est pas indexé, cela peut prendre un certain temps. Et la rapidité "manuelle" pourrait être due au fait que MySQL (ou le système d'exploitation) a été mis en cache dans les données d'une tentative antérieure et s'exécute beaucoup plus rapidement. –

Répondre

6

Vous devez créer un index sur items (itemList_id, TableOrder) et réécrire la requête un peu:

SELECT * 
FROM items 
WHERE itemlist_id = 115626 
ORDER BY 
     itemlist_id DESC, tableOrder DESC 
LIMIT 1 

La première condition ORDER BY peut sembler être redondant, mais il aide MySQL à choisir le bon plan (qui ne trie pas).

+0

Merci! J'ai ajouté l'index et la requête, et maintenant c'est très rapide. –

+0

pouvez-vous s'il vous plaît donner une ressource pour l'édition que vous avez faite à la requête. il est très important de comprendre pourquoi pour moi. – TDSii

+1

@TDSii: J'ai fait l'édition basée sur les docs 'MySQL' et mon expérience. – Quassnoi

Questions connexes