Verständnis mysql erklären
So, ich habe es nie verstanden, das erklären von MySQL. Ich verstehe die groben Konzepte, die sollten Sie mindestens einen Eintrag in der possible_keys
Spalte für die es einen index, und das einfache Abfragen sind besser. Aber was ist der Unterschied zwischen ref und eq_ref? Was ist der beste Weg, um die Optimierung von Abfragen.
Zum Beispiel, dies wird meine Letzte Abfrage, die ich versuche, herauszufinden, warum es ewig dauert (generiert aus django
Modelle) :
+----+-------------+---------------------+--------+-----------------------------------------------------------+---------------------------------+---------+--------------------------------------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------------+--------+-----------------------------------------------------------+---------------------------------+---------+--------------------------------------+------+---------------------------------+
| 1 | SIMPLE | T6 | ref | yourock_achiever_achievement_id,yourock_achiever_alias_id | yourock_achiever_alias_id | 4 | const | 244 | Using temporary; Using filesort |
| 1 | SIMPLE | T5 | eq_ref | PRIMARY | PRIMARY | 4 | paul.T6.achievement_id | 1 | Using index |
| 1 | SIMPLE | T4 | ref | yourock_achiever_achievement_id,yourock_achiever_alias_id | yourock_achiever_achievement_id | 4 | paul.T6.achievement_id | 298 | |
| 1 | SIMPLE | yourock_alias | eq_ref | PRIMARY | PRIMARY | 4 | paul.T4.alias_id | 1 | Using index |
| 1 | SIMPLE | yourock_achiever | ref | yourock_achiever_achievement_id,yourock_achiever_alias_id | yourock_achiever_alias_id | 4 | paul.T4.alias_id | 152 | |
| 1 | SIMPLE | yourock_achievement | eq_ref | PRIMARY | PRIMARY | 4 | paul.yourock_achiever.achievement_id | 1 | |
+----+-------------+---------------------+--------+-----------------------------------------------------------+---------------------------------+---------+--------------------------------------+------+---------------------------------+
6 rows in set (0.00 sec)
Ich hatte gehofft zu lernen, genug über mysql erklären, dass die Abfrage wäre nicht nötig. Ach, es scheint, dass Sie nicht genug bekommen können Informationen aus den explain-Anweisung, und Sie müssen die raw-SQL. Abfrage :
SELECT `yourock_achievement`.`id`,
`yourock_achievement`.`modified`,
`yourock_achievement`.`created`,
`yourock_achievement`.`string_id`,
`yourock_achievement`.`owner_id`,
`yourock_achievement`.`name`,
`yourock_achievement`.`description`,
`yourock_achievement`.`owner_points`,
`yourock_achievement`.`url`,
`yourock_achievement`.`remote_image`,
`yourock_achievement`.`image`,
`yourock_achievement`.`parent_achievement_id`,
`yourock_achievement`.`slug`,
`yourock_achievement`.`true_points`
FROM `yourock_achievement`
INNER JOIN
`yourock_achiever`
ON `yourock_achievement`.`id` = `yourock_achiever`.`achievement_id`
INNER JOIN
`yourock_alias`
ON `yourock_achiever`.`alias_id` = `yourock_alias`.`id`
INNER JOIN
`yourock_achiever` T4
ON `yourock_alias`.`id` = T4.`alias_id`
INNER JOIN
`yourock_achievement` T5
ON T4.`achievement_id` = T5.`id`
INNER JOIN
`yourock_achiever` T6
ON T5.`id` = T6.`achievement_id`
WHERE
T6.`alias_id` = 6
ORDER BY
`yourock_achievement`.`modified` DESC
InformationsquelleAutor der Frage Paul Tarjan | 2009-07-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Paul:
Diese sind wortwörtlich kopiert aus dem MySQL-Handbuch: http://dev.mysql.com/doc/refman/5.0/en/using-explain.html
Wenn du posten könntest deine Abfrage, die immerich konnte helfen, festzulegen, was eine Verlangsamung. Bitte auch angeben, was Ihre definition von immer ist. Auch, wenn Sie könnte Ihre "SHOW CREATE TABLE xxx;" - Anweisungen für diese Tabellen, ich könnte Hilfe bei der Optimierung Ihrer Abfrage, so viel wie möglich.
Was springt bei mir sofort als einen möglichen Punkt der Verbesserung ist das "Using temporary; Using filesort;". Dies bedeutet, dass eine temporäre Tabelle wurde erstellt, um die der Anfrage genügen (nicht unbedingt eine schlechte Sache), und dass die GRUPPE DURCH die/, UM DURCH Sie bezeichnet konnte nicht abgerufen werden aus einem index, so dass sich eine filesort.
InformationsquelleAutor der Antwort hobodave
Abfrage scheint zu Prozess
(244 * 298 * 152) = 11,052,224
Datensätze, die nachUsing temporary; Using filesort
müssen sortiert werden.Dies kann lange dauern.
Wenn Sie posten Sie Ihre Anfrage, wir werden wahrscheinlich in der Lage sein, es zu optimieren, irgendwie.
Update:
Abfrage in der Tat hat eine Anzahl von geschachtelten Schleifen und scheint zu ergeben, die viele Werte, die müssen sortiert werden, dann.
Könnten Sie bitte die folgende Abfrage ausführen:
InformationsquelleAutor der Antwort Quassnoi