Stockt Ihre SQL-Anweisung und liefert die Daten mit spürbarer Verzögerung? Will man herausfinden, ob in einem solchen Fall die SQL-Anweisungen Schuld sind, muss man die Zeit messen, die MySQL für die Ausführung einer Anweisung benötigt.

Will ich mit MySQL die Zeit messen, die für die Ausführung einer Anweisung benötigt wird, und führt eine Internetrecherche mit den entsprechenden Stichwörtern durch, gehören die meisten Artikel zu folgenden Kategorien:

Es würde oft aber eine kurze Laufzeitmessung reichen und man will sich nicht in Benchmarkumgebungen einarbeiten oder Client-Anwendungen programmieren. Die Anfragen aus den Foren werden nicht selten mit dem Hinweis eingeleitet, dass ja der Konsolen-Client von MySQL auch eine Ausführungszeit angibt, die Information also irgendwie vorhanden sein muss:

Bild 1: Einfache Performancemessung mit MySQL

Zunächst möchte ich darauf hinweisen, dass die Konsolenausgabe des Clients auch eine Messung des Clients ist und nicht eine serverseitige Information, die man abrufen kann.
Als ich für mein Buch Performancemessungen durchführen wollte stand ich auch vor der Frage, wie ich diese vornehmen soll. Ich wollte keine umfangreiche Benchmarkumgebung verwenden, da die Messungen für die Leser leicht nachvollziehbar sein sollten. Die Funktion BENCHMARK () kam nicht in Frage, da sie überhaupt nicht tut, was ich wollte (wofür braucht man diese Funktion eigentlich?).
Nach einiger Recherche fand ich den Tipp, mit der Profiling-Fähigkeit von MySQL zu arbeiten; und siehe da – es ward Licht. In der MySQL-Datenbank INFORMATION_SCHEMA gibt es die Tabelle PROFILING:

Bild 2: Einfache Performancemessung mit MySQL

Wird eine Anweisung ausgeführt, wird dieser eine QUERY_ID zugewiesen. Die Ausführung einer Anweisung wird in mehrere Arbeitsschritte zerlegt, die entsprechend ihrer Reihenfolge eine Sequenznummer (SEQ) erhalten. In DURATION wird die Ausführungszeit in Sekunden abgelegt.
Da das Protokollieren in dieser Tabelle selbst Zeit kostet, die man normalerweise nicht verschwenden will, wird die Tabelle nur gefüllt, wenn man mit SET PROFILING = 1 oder SET PROFILING = ON den Server anweist, die Messdaten zu protokollieren. Ein Beispiel:

Bild 3: Einfache Performancemessung mit MySQL

Unsere Abfrage hat die QUERY_ID 4 zugewiesen bekommen. Dass dies die QUERY_ID der zuletzt ausgeführten Abfrage ist, erreiche ich durch die Unterabfrage in der WHERE-Klausel. Da die Tabelle PROFILING pro Sitzung gepflegt wird, muss ich mir keine Sorgen darüber machen, dass die letzte Abfrage vielleicht eine Abfrage aus einer anderen Sitzung ist. Der Befehlszusatz SQL_NO_CACHE verhindert, dass die Messdaten durch Cachestrategien beeinflusst werden. Will man aber genau diese Cacheeffekte messen, sollte dieser Zusatz nicht verwendet werden.Interessant sind nun zwei Spalten: STATE und DURATION. STATE ist deshalb spannend, da ich erfahre, wie eine solche Abfrage eigentlich abgearbeitet wird. Auch wird mir mitgeteilt, welcher Teilschritt eigentlich die meiste Zeit verbraucht. Man sieht an diesem Beispiel sehr schön, dass das Senden der Daten (SEQ=10) teurer ist, als die eigentliche Ausführung der Abfrage (SEQ=9).

Möchte ich nun die Gesamtausführungszeit ermitteln, sieht meine Abfrage etwas anders aus:

Bild 4: Einfache Performancemessung mit MySQL

Bitte beachten Sie, dass der SELECT der Messung auch in der Tabelle PROFILING protokolliert wird. Will man nun eine Messreihe aufbauen, so kann man das Ergebnis dieser Abfrage in einer Messtabelle abspeichern:

Bild 5: Einfache Performancemessung mit MySQL

In einer Prozedur kann dann eine Messreihe durchgeführt werden.

Mit CALL messung_durchführen(100) wird nun 100mal zuerst der Testdatenbestand erweitert oder verändert, dann eine Anweisung auf den Testdaten durchgeführt und abschließend die Ausführungszeit in die Tabelle messung eingefügt. Mit Hilfe dieses Vorgehens habe ich einige Versuche durchgeführt: rechnen mit DOUBLE vs. DECIMAL, suchen mit und ohne Index, NULL oder NOT NULL, etc. Ich fand das Vorgehen einfach zu verstehen und leicht umzusetzen.

SQL. Eine Einführung mit vertiefenden Exkursen

SQL. Eine Einführung mit vertiefenden Exkursen

Weitere hilfreiche Tipps finden sich in SQL. Eine Einführung mit vertiefenden Exkursen.