MySQL-Datenbanken bringen Anwendungen erst dann zum Straucheln, wenn Abfragen plötzlich Sekunden statt Millisekunden brauchen. Das Problem: Ohne gezielte Diagnose-Tools tappt man im Dunkeln und rät, welche Query den Flaschenhals verursacht. Dieser Guide zeigt, wie Sie mit MySQLs Bordmitteln – Slow Query Log, EXPLAIN und Performance Schema – langsame Abfragen systematisch aufspüren und beheben.

Standard long_query_time: 10 Sekunden · Performance Schema seit: MySQL 5.6 · EXPLAIN-Typen: EXTENDED, FORMAT=JSON · Empfohlene min. Buffer Pool: 128 MB · Slow Log-Aktivierung: slow_query_log=1

Kurzüberblick

1Bestätigte Fakten
  • Slow Query Log ist das traditionelle Werkzeug zur Findung langsamer Abfragen (OneUptime Blog)
  • EXPLAIN zeigt den Execution Plan einer Abfrage (OneUptime Blog)
  • Performance Schema liefert abfragbare Metrics ohne Log-Dateien (OneUptime Blog)
2Was unklar ist
  • Genauer Impact einzelner Optimierungen ohne Real-World-Tests
  • Wirklicher Overhead variiert je nach Workload erheblich
3Zeitleisten-Signal
  • Microsekunden-Präzision im Slow Query Log seit MySQL 5.1 verfügbar (Percona Blog)
  • Performance Schema eingeführt mit MySQL 5.5, stabil ab 5.6+ (Percona Blog)
4Wie es weitergeht
  • Indizes hinzufügen und Queries umschreiben als Kernstrategien
  • Buffer Pool-Konfiguration als nächster Hebel

Die folgende Tabelle fasst die wichtigsten technischen Eckdaten zusammen, die Sie beim Einstieg in die MySQL-Performance-Analyse kennen sollten.

Parameter Standardwert / Info
MySQL-Version für P_S 5.6+
Default Slow Log deaktiviert
EXPLAIN Rows examined Schätzung
Typische Bottlenecks Full Table Scans

Wie analysiert man das MySQL Slow Query Log?

Das Slow Query Log gehört seit Jahrzehnten zum Standard-Repertoire jedes MySQL-Administrators. Es schreibt alle Abfragen, die einen definierten Schwellenwert überschreiten, in eine Log-Datei – strukturiert, nützlich, aber mit einem Haken: Der Overhead kann in Worst-Case-Szenarien über 40% betragen (Percona Blog).

Slow Query Log aktivieren

Aktivieren Sie das Logging mit der Systemvariable slow_query_log=1. Der Schwellenwert wird über long_query_time gesteuert:

Konfigurations-Tipp

Setzen Sie long_query_time=2, um bereits Abfragen ab 2 Sekunden zu protokollieren – der Standard von 10 Sekunden ist für die meisten Workloads zu hoch.

SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log_file = '/var/lib/mysql/slow.log';

Log-Datei lokalisieren

Die Log-Datei liegt standardmäßig im MySQL-Datenverzeichnis. Prüfen Sie den Pfad mit SHOW VARIABLES LIKE 'slow_query_log_file'. Das Database Journal empfiehlt, die Datei regelmäßig zu rotieren, um Speicherplatz zu sparen (Database Journal).

Problematische Abfragen filtern

Analysieren Sie das Log mit dem Kommandozeilen-Tool mysqldumpslow, das die Rohdaten aggregiert und lesbar aufbereitet:

mysqldumpslow -s t /var/lib/mysql/slow.log | head -20

Dies zeigt die 20 langsamsten Abfragen sortiert nach Gesamtausführungszeit. Achten Sie auf das Feld Lock_time – hohe Sperrzeiten deuten auf Contention hin.

Fazit: Das Slow Query Log liefert historische Daten und ist kompatibel mit Drittanbieter-Tools wie pt-query-digest, verursacht aber messbaren Overhead.

Wie verwendet man MySQL EXPLAIN?

Der EXPLAIN-Befehl ist das direkteste Werkzeug, um zu verstehen, wie MySQL eine Abfrage ausführt – ohne sie tatsächlich auszuführen. Die Ausgabe zeigt, welcher Index verwendet wird (oder eben nicht), wie viele Zeilen geschätzt werden, und ob Sortierungen erzwungen werden.

EXPLAIN-Befehl ausführen

EXPLAIN SELECT * FROM orders WHERE customer_id = 123 AND status = 'pending';

Ausgabe lesen und interpretieren

Die kritischen Spalten in der EXPLAIN-Ausgabe:

  • type: ALL bedeutet Full Table Scan – fast immer optimierungsbedürftig
  • key: Zeigt den tatsächlich verwendeten Index; NULL = kein Index
  • rows: Geschätzte Anzahl untersuchter Zeilen
  • Extra: “Using filesort” oder “Using temporary” sind Warnsignale
Warum das matters

Ein type: ALL bei einer Tabelle mit Millionen Zeilen bedeutet: MySQL liest jede einzelne Zeile. Das sind nicht theoretische Zahlen – das sind Abfragen, die Sekunden oder Minuten dauern.

Optimierungsempfehlungen ableiten

Wenn key: NULL erscheint, prüfen Sie, ob ein Index für die WHERE-Klausel fehlt. Mit FORMAT=JSON erhalten Sie detaillierte Kosteninformationen:

EXPLAIN FORMAT=JSON SELECT * FROM orders WHERE customer_id = 123;
Fazit: EXPLAIN zeigt sofort, wo MySQL ineffizient arbeitet. Die Zeilenschätzungen sind nicht immer exakt, aber die Tendenz ist verlässlich genug für Optimierungsentscheidungen.

Wie nutzt man Performance Schema für langsame Abfragen?

Performance Schema (P_S) ist eine Storage Engine, die Metriken über Abfrageausführung in strukturierter Form bereitstellt – direkt abfragbar per SQL, ohne Log-Dateien zu schreiben. Das Database Journal beschreibt P_S als elegantere Alternative zum Slow Query Log, insbesondere weil der Overhead deutlich geringer ausfällt (Database Journal).

Performance Schema aktivieren

Performance Schema ist ab MySQL 5.6 standardmäßig aktiviert, lässt sich aber bei Bedarf explizit einschalten:

SET GLOBAL performance_schema = ON;
-- Prüfen der Aktivierung:
SHOW VARIABLES LIKE 'performance_schema';

events_statements_history nutzen

Die Tabelle events_statements_summary_by_digest aggregiert alle ausgeführten Statements nach ihrer SQL-Digest-Signatur:

SELECT DIGEST, SCHEMA_NAME, COUNT_STAR, 
       SUM_TIMER_WAIT/1000000000000 AS total_sec,
       AVG_TIMER_WAIT/1000000000000 AS avg_sec,
       SUM_ROWS_EXAMINED
FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;
Sortierlogik

Sortieren Sie nach SUM_TIMER_WAIT für die Gesamtausführungszeit oder nach AVG_TIMER_WAIT für konsistent langsame Queries – beide Perspektiven sind wertvoll.

Langsame Queries filtern

Filtern Sie auf Schwellenwerte, die zu Ihrem Use Case passen:

SELECT * FROM performance_schema.events_statements_summary_by_digest
WHERE AVG_TIMER_WAIT > 2000000000  -- > 2 Sekunden in Picosekunden
ORDER BY SUM_TIMER_WAIT DESC;
Fazit: Performance Schema ermöglicht Live-Analyse ohne Logging-Overhead. Die Metrics sind abfragbar wie normale Tabellen – ideal für Dashboards und automatisierte Alerts.

Wie findet man heraus, welche Abfrage lange dauert?

Neben Slow Query Log und Performance Schema gibt es Immediate-Diagnosewerkzeuge für den Moment: SHOW PROCESSLIST zeigt aktuell laufende Queries, und die Profilierung liefert präzise Timing-Daten.

Aktuelle Prozesse mit SHOW PROCESSLIST

SHOW FULL PROCESSLIST;
Was Sie sehen

Jede Zeile stellt eine Verbindung dar: den User, die Datenbank, den Status (Sleep, Query, Locked) und – entscheidend – die aktuelle Query. Prozesse mit Status “Query” und hoher Time sind Ihre Kandidaten.

Profiling aktivieren

SET profiling = 1;
-- Ihre zu analysierende Query:
SELECT * FROM orders WHERE created_at > '2024-01-01';
SHOW PROFILES;

Top-Verbraucher identifizieren

Percona empfiehlt pt-query-digest als Alternative zu mysqldumpslow – das Tool gruppiert ähnliche Queries und zeigt, welche Muster am häufigsten zu Problemen führen:

pt-query-digest /var/lib/mysql/slow.log
Fazit: Für Immediate-Diagnose ist SHOW PROCESSLIST unschlagbar. Für historische Trends bleibt das Slow Query Log das Referenz-Tool, während Performance Schema den Sweet Spot zwischen Detailtiefe und Overhead bietet.

Wie beschleunigt man MySQL-Abfragen?

Die Diagnose-Tools zeigen Ihnen das Problem – jetzt geht es an die Lösung. Die drei effektivsten Hebel: Indizes, Query-Rewriting und Konfiguration.

Indizes hinzufügen

Composite-Indizes decken mehrere Spalten in der WHERE-Klausel ab:

-- Falsch: Einzelne Indizes auf jeder Spalte
CREATE INDEX idx_customer ON orders(customer_id);
CREATE INDEX idx_status ON orders(status);

-- Besser: Ein Composite-Index für die Kombination
CREATE INDEX idx_customer_status ON orders(customer_id, status);
Warnung

Jeder Index kostet Schreibperformance – bei Write-lastigen Tabellen kann ein Übermaß an Indizes kontraproduktiv sein. Das Database Journal empfiehlt, Indizes regelmäßig auf Nutzung zu prüfen (Database Journal).

Joins optimieren

Explizite JOINs statt impliziter Cross-Joins im WHERE:

-- Langsam: Impliziter Join
SELECT * FROM orders, customers 
WHERE orders.customer_id = customers.id AND customers.city = 'Berlin';

-- Schneller: Expliziter JOIN mit early filtering
SELECT o.* FROM orders o
INNER JOIN customers c ON o.customer_id = c.id
WHERE c.city = 'Berlin';

Konfiguration anpassen

Der InnoDB Buffer Pool ist der wichtigste knob für read-lastige Workloads:

-- Empfohlene Mindestgröße: 128 MB, idealerweise 70-80% des RAM
SET GLOBAL innodb_buffer_pool_size = 128 * 1024 * 1024;

Setzen Sie diesen Wert in der my.cnf für persistente Konfiguration.

Upsides

  • Indizes reduzieren Full Table Scans drastisch
  • Performance Schema zeigt sofortige Effekte
  • Buffer Pool-Vergrößerung hilft bei wiederholten Reads

Downsides

  • Zu viele Indizes verlangsamen INSERT/UPDATE
  • Overhead durch aktiviertes Logging kann Performance verschlechtern
  • Buffer Pool über 80% RAM kann OS-Swapping auslösen

Performance Schema ist ein Storage Engine, das Details über Abfrageausführung in strukturierter Form bereitstellt, zugänglich über SQL – ohne den Overhead von Log-Dateien.

— Database Journal (Fachmedium für Datenbankadministration)

Bei moderater Detailstufe ‘microtime’ wurden 15.1K Abfragen protokolliert, während ‘full’ Verbosity die Anzahl auf 11.6K reduzierte – ein Trade-off zwischen Detailtiefe und Performance-Impact.

— Percona Blog (MySQL-Spezialisten)

Zusammenfassung

Langsame MySQL-Abfragen sind kein unvermeidbares Übel – sie sind ein Diagnose-Problem. Mit Slow Query Log, EXPLAIN und Performance Schema bietet MySQL alle Werkzeuge, die Sie brauchen, vorausgesetzt, Sie wissen, wie Sie sie einsetzen. Für Entwickler, die gerade eine langsame Anwendung debuggen: Analysieren Sie zuerst mit EXPLAIN die Queries, die Ihr APM meldet, aktivieren Sie dann Performance Schema für den Überblick, und nehmen Sie sich die Zeit, die richtigen Indizes zu bauen – es ist der größte einzelne Hebel für Query-Performance.

Verwandte Beiträge: Netflix Code NW-2-5 beheben: So lösen Sie den Fehler

Häufig gestellte Fragen

Was verursacht langsame MySQL-Abfragen?

Häufige Ursachen sind fehlende Indizes, Full Table Scans, ungünstige JOINs, falsche WHERE-Klauseln und zu kleiner Buffer Pool. EXPLAIN und Performance Schema zeigen schnell, wo der Engpass liegt.

Wie aktiviert man Performance Schema?

Setzen Sie performance_schema=ON in der MySQL-Konfiguration oder per SET GLOBAL performance_schema = ON;. Ab MySQL 5.6+ ist es standardmäßig aktiviert.

Was bedeutet ‘Using filesort’ in EXPLAIN?

MySQL muss die Ergebnisse zusätzlich sortieren, weil kein Index die gewünschte Reihenfolge liefert. Bei großen Ergebnismengen ist das teuer – oft hilft ein passender Index.

Sollte man mysqldumpslow verwenden?

Ja, für die initiale Analyse des Slow Query Logs. Das Tool aggregiert identische Queries und zeigt auf einen Blick, welche Muster die meiste Zeit kosten. Für komplexere Reports ist pt-query-digest von Percona eine leistungsfähigere Alternative.

Wie oft sollte man Indizes aktualisieren?

Indizes ändern sich nicht automatisch, aber ihre Nutzung sollte regelmäßig geprüft werden. Entfernen Sie ungenutzte Indizes und fügen Sie neue für geänderte Abfragemuster hinzu – idealerweise im Rahmen von Release-Zyklen.

Unterschied Slow Log und General Log?

Das Slow Query Log protokolliert nur Abfragen, die einen Schwellenwert überschreiten. Das General Log erfasst alle Queries – nützlich für Debugging, aber mit erheblichem Performance-Impact im Produktivbetrieb.

Braucht man Drittanbieter-Tools?

MySQLs Bordmittel reichen für die meisten Fälle. Tools wie pt-query-digest von Percona oder PMM (Percona Monitoring and Management) bieten zusätzlichen Komfort und Visualisierung – sinnvoll bei komplexen Infrastrukturen oder wenn Sie ohne Kommandozeile arbeiten müssen.