Fachbeitrag von Ralf Adams

Einfache Performancemessungen mit MySQL


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. Eine einfache Lösung für dieses Problem liefert Ralf Adams, Diplom-Informatiker und Autor von SQL. Eine Einführung mit vertiefenden Exkursen, in diesem Fachbeitrag.

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:

  • Anfragen in Foren, wie so etwas funktioniert
  • Hinweise auf die MySQL Funktion BENCHMARK () – siehe [1]
  • Verweis auf Benchmarkumgebungen – siehe [2]
  • PHP- oder andere Client-Skripte zur Laufzeitmessung
    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:

CHV_Adams_MySQL_1

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 (siehe [3]); und siehe da – es ward Licht. In der MySQL-Datenbank INFORMATION_SCHEMA gibt es die Tabelle PROFILING:

CHV_Adams_MySQL_2

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:

CHV_Adams_MySQL_3

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:

CHV_Adams_MySQL_4

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:

CHV_Adams_MySQL_5

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.
Kritiken oder Ergänzungen sind sehr erwünscht und können an gesendet werden.

Verlagsbereiche

FachbuchFachzeitschriftenTagungen und MessenLiteraturKinderbuch

Fachportale

FORM + WerkzeugHANSER automotiveHANSER KonstruktionKunststoffeKunststoffe.tvKunststoffe internationalQZ Qualität und ZuverlässigkeitWB Werkstatt + Betrieb

Wissenschaftsportale

HTM Journal of Heat Treatment and MaterialsInternational Journal of Materials ResearchInternational Polymer ProcessingKerntechnikMP Materials TestingPractical MetallographyTenside Surfactants DetergentsZeitschrift KunststofftechnikZWF Zeitschrift für wirtschaftlichen Fabrikbetrieb

Partnerportale

automationbbr Bänder Bleche Rohreenergiespektrum:K Kompetenz für Konstrukteureg+h Gebäudetechnik und Handwerklogistik journalmaschine + werkzeug

Carl Hanser Verlag GmbH & Co. KG · Kolbergerstraße 22 · 81679 München
Telefon: +49 89 99830-0 · Fax: +49 89 984809 · E-Mail