2009-04-25 5 views
48

Ich helfe bei der Wartung eines Programms, das im Wesentlichen ein freundliches Read-Only-Frontend für eine große und komplizierte MySQL-Datenbank ist - das Programm erstellt Ad-hoc-SELECT-Abfragen von Benutzereingaben, sendet die Abfragen an die DB, bekommt die Ergebnisse, post-processes sie und zeigt sie schön zurück zum Benutzer an.Wie verwende ich EXPLAIN, um * die Leistung einer MySQL-Abfrage * vorherzusagen?

Ich möchte eine Form der vernünftigen/heuristischen Vorhersage für die erwartete Leistung der konstruierten Abfrage hinzufügen - manchmal machen Benutzer versehentlich Abfragen, die zwangsläufig sehr lange dauern werden (weil sie riesige Ergebnismengen zurückgeben werden, oder weil sie "gegen den Strich gehen", wie die DB indiziert wird, und ich möchte dem Benutzer einige "einigermaßen zuverlässige" Informationen anzeigen/schätzen, wie lange die Abfrage dauern wird. Es muss nicht perfekt sein, solange es nicht so schlecht wird und oft nicht mit der Realität verschmutzt wird, um einen "Schreiwolf" -Effekt zu verursachen, bei dem die Benutzer lernen, es zu ignorieren ;-) Basierend auf diesen Informationen, a Benutzer könnte sich entscheiden, einen Kaffee zu holen (wenn die Schätzung 5-10 Minuten ist), gehen Sie zum Mittagessen (wenn es 30-60 Minuten ist), töten Sie die Abfrage und versuchen Sie stattdessen etwas anderes (vielleicht engere Grenzen für die Informationen, die sie anfordern), etc, etc.

Ich bin nicht sehr vertraut mit MySQL EXPLAIN-Anweisung - Ich sehe eine Menge Informationen darüber, wie man es zu optimieren eine Abfrage oder ein DB-Schema, Indizierung, etc., aber nicht viel darüber, wie ich es für meinen begrenzteren Zweck verwenden kann - mache einfach eine Vorhersage und nimm die DB als gegeben (natürlich, wenn die Vorhersagen zuverlässig genug sind, kann ich eventuell zu ihnen wechseln, um zwischen alternativen Formen zu wählen Abfrage könnte dauern, aber, das ist für die Zukunft: für jetzt würde ich viel glücklich sein, nur um die Performance-Schätzungen zu den Benutzern für die oben genannten Zwecke zu zeigen).

Irgendwelche Hinweise ...?

Antwort

20

EXPLAIN gibt Ihnen keinen Hinweis darauf, wie lange eine Abfrage dauern wird. Im besten Fall könnte man damit raten, welche von zwei Abfragen schneller sein könnte, aber wenn einer von ihnen offensichtlich nicht schlecht geschrieben ist, dann wird das sogar sehr schwer werden.

Sie sollten sich darüber im Klaren sein, dass selbst das Ausführen von EXPLAIN bei Verwendung von Unterabfragen langsam sein kann (in manchen Fällen fast so langsam wie die Abfrage selbst).

Soweit mir bekannt ist, MySQL bietet keine Möglichkeit, die Zeit zu schätzen, die eine Abfrage dauern wird. Können Sie die Zeit protokollieren, die jede Abfrage benötigt, um eine Schätzung zu erstellen, die auf dem Verlauf früherer ähnlicher Abfragen basiert?

+1

Lesen nicht Unterabfragen zu diesem Zeitpunkt erzeugen, so dass Bit kein Problem sein sollte. Aber trotzdem danke für den Hinweis - und die Nachricht, dass es keine gute Möglichkeit gibt, die Kosten einer Abfrage abzuschätzen (schlechte Nachrichten, aber besser zu lernen, bevor ich unbegrenzte Zeit damit verbringe, eine Chimäre zu jagen!). –

+10

EXPLAIN ist sehr hilfreich. Ich bin nicht sicher, warum dies die "Antwort" ist. Überprüfe die Kardinalität - je höher die Anzahl der Zeilen, desto mehr muss gesucht werden. Außerdem wird angezeigt, welche Indexe gegebenenfalls verwendet werden. Dies ist entscheidend für die SELECT-Leistung. Wie für Unterabfragen ist es sehr selten, dass sie tatsächlich benötigt werden - sie sollten umgestaltet werden, wenn es der Übersichtlichkeit halber möglich ist. –

11

Ich denke, wenn Sie eine Chance haben möchten, etwas ziemlich Verlässliches daraus zu bauen, sollten Sie ein statistisches Modell aus Tabellengrößen und zerlegten EXPLAIN-Ergebniskomponenten erstellen, die mit Abfrageverarbeitungszeiten korreliert sind. Versuchen Sie, eine Abfrage Ausführungszeit Prädiktor basierend auf Denken über den Inhalt eines EXPLAIN wird einfach viel zu lange verbringen geben peinlich schlechte Ergebnisse, bevor es zu vage Nützlichkeit verfeinert wird.

2

MySQL EXPLAIN hat eine Spalte namens Key. Wenn sich in dieser Spalte etwas befindet, ist dies ein sehr guter Hinweis, dh die Abfrage verwendet einen Index.

Abfragen, die Indizes verwenden, sind in der Regel sicher zu verwenden, da sie wahrscheinlich vom Datenbankentwickler gedacht wurden, wenn er/sie die Datenbank entwarf.

jedoch

Es ist ein weiteres Feld Extra genannt. Dieses Feld enthält manchmal den Text using_filesort.

Dies ist sehr sehr schlecht. Das bedeutet wörtlich, dass MySQL weiß, dass die Abfrage ein Ergebnis hat, das größer als der verfügbare Speicher ist, und beginnt daher, die Daten auf die Festplatte zu tauschen, um sie zu sortieren.

Fazit

Statt vorherzusagen sehen die Zeit eine Abfrage dauert, einfach auf diese beiden Indikatoren zu versuchen. Wenn eine Abfrage using_filesort lautet, verweigern Sie den Benutzer. Und je nachdem, wie strikt Sie sein möchten, sollten Sie die Abfrage auch ablehnen, wenn die Abfrage keine Schlüssel verwendet.

mehr über die Ergebnismenge der wir MySQL EXPLAIN statement

Verwandte Themen