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 ...?
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!). –
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. –