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:

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

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

(4) Profiling der Abfrage.

SHOW PROFILE FOR QUERY 30;   // example 

Dies zeigt die Details der Abfrage.

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

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ß!

2
Okt

Sommerzeit oder Winterzeit?

categories MySQL, SQL-Schnipsel    

Inspiriert von Shinguz habe ich auf eigene Faust mal versucht, via SQL zu prüfen, ob wir uns in Sommerzeit oder Winterzeit befinden.

Hier mein SQL-Resultat (funzt mit MySQL):

SELECT 
    IF(TIMESTAMPDIFF(
        HOUR , UTC_TIMESTAMP(), SYSDATE()
      ) = 2, 
      'Sommerzeit', 
      'Winterzeit') 
AS "Zeit";

Zwar würde ich sowas eher via Programmcode lösen, aber auf einem zeittechnisch ordentlich aufgesetzten Datenbankserver lässt sich sowas durchaus verwenden!

15
Okt

Betragsformatierung in SELECT-Statements

categories Computer, MySQL, SQL-Schnipsel, Tutorials    

Vielleicht stand der ein oder andere schonmal vor dem Problem, einen Betrag direkt aus einem SELECT-Statement heraus formatieren zu müssen, ohne das Ergebnis nachträglich mit einem anderen Hilfsmittel (z.B. mittels Programmcode, Reportgenerator o.ä.) zu „veredeln“.

Mir ging es jedenfalls heute so, daher folgt hier mein Lösungsweg.
(more…)

23
Sep

Upgrade von MySQL (Windows)

categories Computer, MySQL, Tutorials    

Aufgrund eines Tests der neuen MySQL-Funktion „Partitionierung“ erachtete ich es als notwendig, mal wieder meine kleine Testinstallation des MySQL-Community-Servers auf einen aktuellen Stand zu bringen. Derzeit aktuell ist 5.1.28, deklariert als Release Candidate, bis dato lief 5.0.67.

Da es sich nur um ein Testsystem handelt, war dieses Update natürlich unkritisch – für Produktionsumgebungen empfehle ich konventionellere Wege, wesentlich sorgfältigeres Vorbereiten und genaues Befolgen der von MySQL empfohlenen Installationsschritte.

1. Backup der bestehenden Installation + Daten
…läuft in meiner Testumgebung ohnehin nächtlich als Batch, somit prüfte ich nur, ob es lief bzw. wann zuletzt Änderungen an der Test-DB vorgenommen worden sind.

2. Download der Binaries
http://dev.mysql.com/downloads/mysql/5.1.html, ich entschied mich für die Windows-Variante „without installer“. Man bezieht damit ein gepacktes Archiv mit allen Binaries und Skripten.

3. Anhalten des Dienst
Da ich den MySQL-Server als Dienst laufen lasse, muss dieser vor dem Upgrade gestoppt werden. Wie? Entweder via Kommandozeile oder via GUI (Verwaltung / Dienste / Mysql – Dienst anhalten).

4. Binaries in die bestehende Installation kopieren
Ich entpackte das vorher gedownloadete Archiv direkt und gnadenlos in das Programmverzeichnis, unter welchem meine alte MySQL-Installation lief.

5. Dienst starten
Auch hier gilt: entweder via Kommandozeile oder via GUI (Verwaltung / Dienste / Mysql – Dienst starten). Und siehe da, der Server läuft wieder.

6. Update-Programm von MySQL ausführen
…am besten via Kommandozeile:

mysql-upgrade.exe

(versteckt sich im /bin-Verzeichnis).
Dieses Tool startet mehrere MySQL-Kontrollskripts und -Programme, welche die bestehenden Datenbanken auf Inkompabilitäten prüft und ggf. repariert. Auch werden die Privilegien entsprechend angepasst.

Fertig!

Am längsten dauerte der Download, es handelt sich um insgesamt etwa 90 MB. Insgesamt hatte ich die Installation innerhalb von fünf Minuten aktualisiert. Und jetzt bin ich gespannt, was das Partitionieren hergibt! 😉

20
Okt

Die Angst des Programmierers vor dem SQL-Join

categories Computer, MySQL, Tutorials    

Ein Artikel von Jeff Atwood in seinem Blog „Coding Horror“ sowie zwei passgenau zum gleichen Zeitpunkt sich ereignende programmiertechnische Episoden reizen mich, mal eine Lanze für Joins in SQL-Statements zu brechen. Joins sind eine schöne Sache und eigentlich nicht sehr schwierig. Aktuelle RDBMS kommen prima mit Joins aus, also gibt es Gründe, auf Joins zu verzichten?
(more…)

Next Page →