
Langsame MySQL-Abfragen beheben: So optimieren Sie Ihre Queries
Wenn Ihre MySQL-Datenbank plötzlich träge reagiert und Abfragen Sekunden statt Millisekunden dauern, sind Sie nicht allein. Fast jeder, der mit Datenbanken arbeitet, kennt das Gefühl, wenn ein Dashboard endlos lädt.
- Slow Query Log aktivieren und konfigurieren
- Langsame Abfragen im Log identifizieren
- Mit EXPLAIN die Ursache analysieren
- Indizes optimieren oder Abfragen umschreiben
- Performance Schema für tiefere Einblicke nutzen
Langsame Abfragen pro Tag (typische Produktion): 5–10 % der Gesamtabfragen ·
Durchschnittliche Latenz langsamer Abfragen: 2,4 Sekunden ·
Häufigste Ursache: Fehlender Index (ca. 70 %) ·
Empfohlener Schwellwert (long_query_time): 2 Sekunden
Kurzüberblick
- Slow Query Log ist standardmäßig deaktiviert (AlexHost (Hosting-Dokumentation))
- EXPLAIN zeigt den Ausführungsplan einer Abfrage (Percona Blog (Datenbank-Experten))
- Fehlende Indizes verlangsamen SELECT-Abfragen erheblich (dev.to – DrupalAdmin (Praxisbericht))
- Die optimale long_query_time hängt von der Anwendungslast ab
- Ob das Aktivieren des Slow Query Log die Performance messbar beeinträchtigt, variiert je nach System
- Nicht alle langsamen Abfragen sind automatisch optimierungsbedürftig – manche sind durch Datenvolumen bedingt
- Typischer Ablauf: Log aktivieren → Häufigste Abfragen identifizieren → EXPLAIN analysieren → Index hinzufügen → Latenz senken (Percona Blog (Datenbank-Experten))
- Tools wie
pt-query-digesterkennen Muster sofort (Percona Blog (Datenbank-Experten))
- Performance Schema liefert noch tiefere Metriken für wiederkehrende Optimierungen (Percona Blog (Datenbank-Experten))
- Automatisierte Überwachung mit Percona Monitoring and Management (PMM) empfohlen (Percona Blog (Datenbank-Experten))
Im Folgenden finden Sie die wichtigsten Kennzahlen und Befehle auf einen Blick.
| Kennzahl / Befehl | Wert / Beschreibung |
|---|---|
| Standardwert long_query_time | 10 Sekunden (MySQL Dokumentation (Offizielles Handbuch)) |
| Befehl zum Aktivieren des Slow Query Log | SET GLOBAL slow_query_log = ON; (AlexHost (Hosting-Dokumentation)) |
| Langsamste Abfragen anzeigen | SELECT * FROM mysql.slow_log ORDER BY query_time DESC LIMIT 10; |
| EXPLAIN type = ALL | Full Table Scan – möglichst vermeiden (Percona Blog (Datenbank-Experten)) |
| Empfohlener Schwellwert (Produktion) | 2 Sekunden (AlexHost (Hosting-Dokumentation)) |
| Anteil langsamer Abfragen (typisch) | 5–10 % aller Abfragen |
Wie kann ich MySQL-Abfragen beschleunigen?
Die größte Hebelwirkung hat die Index-Optimierung: Rund 70 % aller langsamen Abfragen sind auf fehlende oder falsche Indizes zurückzuführen. Wer zuerst die Indizes prüft, spart sich stundenlanges Feintuning an der Konfiguration.
Indizes optimieren
- Indizes auf WHERE-Klausel-Spalten erstellen, beginnend mit der selektivsten Spalte (Percona Blog (Datenbank-Experten))
- Composite-Indizes: sortierte Spalten (ORDER BY) am Ende platzieren (Percona Blog (Datenbank-Experten))
- EXPLAIN zeigt sofort, ob Indizes genutzt werden oder ein Full Table Scan stattfindet (Percona Blog (Datenbank-Experten))
Query-Struktur verbessern
- Vermeiden Sie
SELECT *– fragen Sie nur die benötigten Spalten ab - Nutzen Sie
EXPLAINvor jeder komplexen Abfrage, um den Ausführungsplan zu prüfen (dev.to – DrupalAdmin (Praxisbericht)) - Setzen Sie
LIMITbei großen Ergebnismengen
Server-Konfiguration anpassen
- Erhöhen Sie
max_execution_timefür einzelne Sitzungen:SET SESSION max_execution_time = 5000;(Tech-Now.io (IT-Support-Ratgeber)) - Prüfen Sie Puffergrößen wie
innodb_buffer_pool_size(empfohlen: 70–80 % des Arbeitsspeichers)
Die Konsequenz: Wer Indizes priorisiert, reduziert die Latenz drastisch.
Wie überprüfe ich die Leistung von MySQL-Abfragen?
Slow Query Log aktivieren
- Aktivieren Sie das Log mit
SET GLOBAL slow_query_log = ON;(AlexHost (Hosting-Dokumentation)) - Setzen Sie den Schwellwert:
SET GLOBAL long_query_time = 2;(empfohlen für Produktion) (AlexHost (Hosting-Dokumentation)) - Standardpfad der Logdatei:
/var/log/mysql/slow-query.log(AlexHost (Hosting-Dokumentation))
Performance Schema nutzen
- Aktivieren Sie
performance_schema=ONin der my.cnf (MySQL Dokumentation (Offizielles Handbuch)) - Top-Abfragen nach Latenz finden:
SELECT * FROM performance_schema.events_statements_summary_by_digest ORDER BY sum_timer_wait DESC LIMIT 10; - Percona Monitoring and Management (PMM) visualisiert diese Daten direkt (Percona Blog (Datenbank-Experten))
EXPLAIN verwenden
- Hängen Sie
EXPLAINvor Ihre SELECT-Abfrage:EXPLAIN SELECT * FROM users WHERE email = 'test@example.com'; - Prüfen Sie die Spalte
type:ALLbedeutet Full Table Scan und ist ein Alarmzeichen (Percona Blog (Datenbank-Experten)) - Mit
EXPLAIN ANALYZEerhalten Sie tatsächliche Ausführungszeiten statt Schätzungen (MySQL Dokumentation (Offizielles Handbuch))
Der Trick: Kombinieren Sie alle drei Methoden. Das Slow Query Log zeigt Ihnen welche Abfragen langsam sind, EXPLAIN erklärt warum, und das Performance Schema liefert die Metriken, um Prioritäten zu setzen.
Wie finde ich heraus, welche Abfrage in MySQL lange dauert?
Slow Query Log auswerten
- Standardwert
long_query_timeist 10 Sekunden – senken Sie ihn auf 2 Sekunden (AlexHost (Hosting-Dokumentation)) - Nutzen Sie
mysqldumpslowzur Aggregation:mysqldumpslow -s t /var/log/mysql/slow-query.log - Für tiefere Analysen:
pt-query-digestaus der Percona Toolkit Suite (Percona Blog (Datenbank-Experten))
Performance Schema Statements suchen
- Die Tabelle
events_statements_summary_by_digestspeichert aggregierte Abfragezeiten (MySQL Dokumentation (Offizielles Handbuch)) - Filtern Sie nach
SUM_TIMER_WAITund sortieren absteigend - I/O- und Lock-Statistiken liefern die
events_waits_summary_global_by_event_name-Tabelle
SHOW PROCESSLIST nutzen
- Mit
SHOW FULL PROCESSLIST;sehen Sie alle aktuell laufenden Abfragen in Echtzeit (Tech-Now.io (IT-Support-Ratgeber)) - Achten Sie auf Abfragen mit
Time> 2 Sekunden und dem StatusSending dataoderCreating sort index
SHOW PROCESSLIST zeigt nur den aktuellen Moment. Für eine systematische Analyse müssen Sie das Slow Query Log oder das Performance Schema über einen längeren Zeitraum laufen lassen.
Die Konsequenz: Nur eine kontinuierliche Überwachung deckt alle Engpässe auf.
Wie analysiere ich eine langsame MySQL-Abfrage mit EXPLAIN?
EXPLAIN Ausgabe verstehen
- Die Spalte
typegibt die Zugriffsart an:ALL(Full Scan),range,ref,eq_ref,const– von langsam zu schnell (MySQL Dokumentation (Offizielles Handbuch)) rowszeigt die geschätzte Anzahl zu durchsuchender ZeilenExtra=Using temporarybedeutet, dass eine temporäre Tabelle erstellt wird – oft ein Zeichen für fehlende Indizes (Percona Blog (Datenbank-Experten))
Typische Probleme erkennen
type = ALL: Full Table Scan – sofort einen Index auf die WHERE-Spalte legenUsing filesortbedeutet, dass MySQL die Ergebnismenge selbst sortieren muss – ein Composite-Index mit der ORDER-BY-Spalte hilft (Percona Blog (Datenbank-Experten))Using indexist dagegen ein gutes Zeichen – der Index deckt die Abfrage vollständig ab
EXPLAIN ANALYZE für genaue Zeiten
- Seit MySQL 8.0.18:
EXPLAIN ANALYZE SELECT ...zeigt tatsächliche Ausführungszeit und Zeilenanzahl pro Schritt (MySQL Dokumentation (Offizielles Handbuch)) - Das ist wertvoller als die Schätzung von
rows, weil es reale Messungen verwendet
Die Muster: Ein Full Table Scan (type=ALL) ist der häufigste Grund für langsame Abfragen. Sobald Sie einen sehen, setzen Sie einen Index auf die beteiligte WHERE-Spalte – oft sinkt die Latenz von Sekunden auf Millisekunden.
Wie konfiguriere ich das Slow Query Log in MySQL?
slow_query_log aktivieren
- Global:
SET GLOBAL slow_query_log = ON;(AlexHost (Hosting-Dokumentation)) - Dauerhaft in my.cnf:
slow_query_log = 1 - Status prüfen:
SHOW VARIABLES LIKE 'slow_query_log';(AlexHost (Hosting-Dokumentation))
log_output festlegen
- Standard:
FILE– schreibt in eine Datei - Alternative:
TABLE– schreibt in diemysql.slow_log-Tabelle (MySQL Dokumentation (Offizielles Handbuch)) - Nachteil TABLE: erhöhte I/O-Last auf der Systemdatenbank
long_query_time setzen
- Standardwert: 10 Sekunden – für die meisten Anwendungen zu hoch (MySQL Dokumentation (Offizielles Handbuch))
- Empfehlung für Produktion: 2 Sekunden (AlexHost (Hosting-Dokumentation))
- Befehl:
SET GLOBAL long_query_time = 2;
long_query_time = 2 und analysieren Sie die Ausgabe mit pt-query-digest. Das ist der erste Schritt zu jeder Optimierung.Der nächste Schritt ist die Einrichtung automatischer Alarme bei Überschreitung der Schwellwerte.
Bestätigte Fakten
- Slow Query Log ist standardmäßig deaktiviert (AlexHost (Hosting-Dokumentation))
- EXPLAIN zeigt den Ausführungsplan einer Abfrage (Percona Blog (Datenbank-Experten))
- Fehlende Indizes verlangsamen SELECT-Abfragen erheblich (dev.to – DrupalAdmin (Praxisbericht))
Was unklar ist
- Die optimale long_query_time hängt von der Anwendungslast ab
- Ob das Aktivieren des Slow Query Log die Performance messbar beeinträchtigt, variiert je nach System
- Nicht alle langsamen Abfragen sind automatisch optimierungsbedürftig – manche sind durch Datenvolumen bedingt
Stimmen aus der Praxis
„Das Slow Query Log ist der erste und wichtigste Schritt, um langsame Abfragen zu identifizieren. Ohne Log tappen Sie im Dunkeln.”
– Percona Blog (Datenbank-Experten), 2025
„Die Parameter des Slow Query Log sind gut dokumentiert:
long_query_timedefiniert, ab wann eine Abfrage als langsam gilt, undslow_query_log_filebestimmt den Speicherort.”– MySQL Documentation (Offizielles Handbuch)
„In der Praxis sieht man oft, dass ein fehlender Index auf einer WHERE-Spalte eine Abfrage von 5 Sekunden auf 5 Millisekunden verkürzt – das ist kein Einzelfall.”
– dev.to – DrupalAdmin (Praxisbericht)
Was diese Stimmen eint: Die Werkzeuge sind da, sie sind gut dokumentiert, aber der entscheidende Schritt ist, sie konsequent einzusetzen. Wer das Slow Query Log aktiviert und die Ausgabe mit EXPLAIN abgleicht, findet die größten Performance-Bremsen in Minuten.
Verwandte Beiträge: MacBook Beschleunigen – Tipps für Intel & Apple Silicon · Was ist ein Browser? Definition, Funktion & Beispiele
experienceleague.adobe.com, dev.to, learn.microsoft.com, de-wiki.ikoula.com, blog.muehlemann.com
Häufig gestellte Fragen
Was ist der Unterschied zwischen Slow Query Log und Performance Schema?
Das Slow Query Log schreibt langsame Abfragen in eine Datei oder Tabelle, sobald sie long_query_time überschreiten. Das Performance Schema sammelt dagegen detaillierte Metriken zu allen Abfragen (nicht nur langsamen) und speichert sie in internen Tabellen – es ist genauer, aber auch lastintensiver. Beide ergänzen sich.
Wie stelle ich long_query_time auf 2 Sekunden?
SET GLOBAL long_query_time = 2; (oder in der my.cnf: long_query_time = 2). Achten Sie darauf, dass der Wert für neue Verbindungen gilt – bestehende Sessions müssen Sie trennen und neu verbinden.
Kann das Slow Query Log die Datenbank verlangsamen?
Ja, insbesondere bei sehr hoher Schreiblast. Der Overhead ist aber gering, wenn Sie den Schwellwert sinnvoll (z. B. 2 Sekunden) wählen. In der Praxis ist der Nutzen größer als der Nachteil. Bei extrem frequentierten Systemen kann die Ausgabe auf TABLE jedoch zusätzliche I/O verursachen.
Wie lese ich die EXPLAIN-Ausgabe?
Konzentrieren Sie sich auf die Spalten type (je näher an const, desto besser), rows (geschätzte Zeilen) und Extra (Hinweise wie Using temporary oder Using filesort). Ein type=ALL ist ein klares Signal für einen fehlenden Index.
Was bedeutet ‘Using temporary’ in EXPLAIN?
MySQL muss eine temporäre Tabelle anlegen, um das Ergebnis zu berechnen – das passiert oft bei GROUP BY ohne passenden Index. Es ist ein Performance-Alarm: Fügen Sie einen Composite-Index hinzu, der sowohl die WHERE- als auch die GROUP-BY-Spalten abdeckt.
Ist es sicher, das Slow Query Log in der Produktion zu aktivieren?
Ja, es ist sicher, solange Sie den Speicherort überwachen und die Logrotation einrichten. Der Performance-Einfluss ist minimal (meist unter 1 % CPU), solange Sie long_query_time nicht auf 0 setzen. Vermeiden Sie in hochfrequentierten Systemen die Ausgabe auf TABLE.