29
Jun

Profiling mit MySQL

categories Computer, MySQL, Tutorials    

Manchmal begegnet man einer SQL-Abfrage, welche langsamer ist als erwartet. Man weiß genau, alles wurde getan, dass die Tabellen optimiert und sauber indexiert sind. Und dennoch ist die Abfrage zu langsam.

Hier hilft Profiling.

MySQL verfügt über einen eingebauten Profiler, der es ermöglicht, sehr detailliert zu tracen, für welchen Bestandteil einer Abfrage die Datenbank wie lange genau gebraucht hat.

Um den Profiler zu verwenden, geht man wie folgt vor:

(1) Einschalten des Profilers.

Per Default ist der Profiler deaktiviert, daher muss man ihn erst starten.

SET profiling = 1;

(2) Ausführen der eigentlichen Abfrage.

(3) Identifizieren der Abfrage-ID.

SHOW PROFILES;

Dieses Kommando wird in etwa folgendes zeigen:

<br />
    Query_ID |  Duration | Query<br />
    ---------+-----------+-----------------------<br />
      ...    | ...       | ...<br />
       29    | 0.0006200 | SHOW STATUS<br />
       30    | 0.3600000 | SELECT (your query here)<br />
      ...    | ...       | ...<br />

Jetzt weiß man, die Abfrage-ID ist 30.

(4) Profiling der Abfrage.

SHOW PROFILE FOR QUERY 30;   // example 

Dies zeigt die Details der Abfrage.

<br />
    Status                          | Duration<br />
    --------------------------------+-------------------<br />
    starting                        | 0.000010<br />
    checking query cache for query  | 0.000078<br />
    Opening tables                  | 0.000051<br />
    System lock                     | 0.000003<br />
    Table lock                      | 0.000008<br />
    init                            | 0.000036<br />
    optimizing                      | 0.000020<br />
    statistics                      | 0.000013<br />
    preparing                       | 0.000015<br />
    Creating tmp table              | 0.000028<br />
    executing                       | 0.000602<br />
    Copying to tmp table            | 0.000176<br />
    Sorting result                  | 0.000043<br />
    Sending data                    | 0.080032<br />
    end                             | 0.000004<br />
    removing tmp table              | 0.000024<br />
    end                             | 0.000006<br />
    query end                       | 0.000003<br />
    freeing items                   | 0.000148<br />
    removing tmp table              | 0.000019<br />
    closing tables                  | 0.000005<br />
    logging slow query              | 0.000003<br />
    cleaning up                     | 0.000004<br />

In diesem Beispiel wurde die meiste Zeit der Abfrage damit verbracht, das Ergebnis an den Client zurückzusenden. Vielleicht sollte man die Ergebnismenge reduzieren, oder ggf. den Query Cache erhöhen. Vielleicht geht man aber auch ganz anders vor, hier sollte man von Fall zu Fall prüfen, was sinnvoll und möglich ist.

Aber dank dem Profiling weiß man nun, wo man suchen muß!