Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung Datenbanken 01.06.2026 · 8 min Lesezeit

MySQL Slow Query Log einrichten und langsame Abfragen finden (Schritt für Schritt)

MySQL Slow Query Log einrichten und langsame Abfragen finden: Log aktivieren, mit mysqldumpslow auswerten und Ursachen mit EXPLAIN beheben. Für MySQL 8 und MariaDB, Schritt für Schritt.

Geprüft am 30.09.2026

WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Mehr dazu

Messingstoppuhr auf einem Serverschrank im Rechenzentrum, Symbolbild für das Aufspüren langsamer Datenbankabfragen

Wird Ihre Datenbank unter Last langsam, ist das MySQL Slow Query Log das wichtigste Werkzeug zur Fehlersuche. Diese Anleitung zeigt, wie Sie das MySQL Slow Query Log einrichten, langsame Abfragen aufzeichnen, sie mit mysqldumpslow zusammenfassen und mit EXPLAIN gezielt analysieren. Sie richtet sich an Administratoren und Entwickler, die MySQL oder MariaDB auf einem Linux-Server betreiben und langsame MySQL-Abfragen finden und beheben möchten. Die Befehle gelten für MySQL 8.x und MariaDB 10.x/11.x; Abweichungen sind jeweils genannt.

Was ist das Slow Query Log und wofür brauchen Sie es?

Das Slow Query Log ist ein von MySQL/MariaDB geführtes Protokoll, das jede SQL-Abfrage aufzeichnet, deren Ausführung länger als ein definierter Schwellenwert (long_query_time) dauert. Statt zu raten, welche Abfrage Ihre Anwendung ausbremst, erhalten Sie messbare Fakten: Abfragetext, Ausführungszeit, Sperrzeit, untersuchte Zeilen und zurückgegebene Zeilen.

Damit ist das Log die Grundlage, um die MySQL-Performance zu optimieren. Typische Probleme sind fehlende Indizes, N+1-Queries (eine Anwendung feuert pro Schleifendurchlauf eine eigene Abfrage) und ineffiziente JOINs über große Tabellen. Optional kann das Log auch Abfragen erfassen, die gar keinen Index nutzen (log_queries_not_using_indexes).

Voraussetzungen

  1. Ein laufender MySQL-8.x- oder MariaDB-10.x/11.x-Server unter Linux (z. B. Debian/Ubuntu). Zusätzliche Hardware brauchen Sie nicht; planen Sie für die Logdatei einige hundert MB freien Speicher unter /var/log ein.
  2. Zugriff auf die Konfigurationsdatei (/etc/mysql/my.cnf bzw. ein Drop-in unter /etc/mysql/conf.d/).
  3. Einen MySQL-Benutzer mit SUPER- bzw. SYSTEM_VARIABLES_ADMIN-Rechten (üblicherweise root).
  4. Shell-/Root-Zugriff auf den Server, um den Dienst neu zu starten und Logdateien zu lesen.
  5. Eine Anwendung oder Test-Last, die echte Abfragen erzeugt.

Schritt 1: Aktuellen Status des Slow Query Logs prüfen

Prüfen Sie vor jeder Änderung, ob das Log bereits aktiv ist und wo es liegt.

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'slow_query_log_file';
SHOW VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';

Steht slow_query_log auf OFF, ist das Log deaktiviert. Notieren Sie den Pfad aus slow_query_log_file; Standard ist /var/lib/mysql/HOSTNAME-slow.log im Datenverzeichnis.

Verifizieren: Die vier Abfragen liefern je eine Zeile mit Wert, z. B. long_query_time | 10.000000 als Standard.

Schritt 2: MySQL Query Log aktivieren in der my.cnf

Hinterlegen Sie die Optionen dauerhaft in einer eigenen Drop-in-Datei. Bei MariaDB unter Debian/Ubuntu liegt das passende Verzeichnis unter /etc/mysql/mariadb.conf.d/.

sudo mkdir -p /var/log/mysql
sudo chown mysql:mysql /var/log/mysql
sudo nano /etc/mysql/conf.d/slow-query.cnf

Fügen Sie folgenden Block ein. Der Abschnitt [mysqld] ist zwingend.

[mysqld]
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /var/log/mysql/slow.log
log_queries_not_using_indexes = 1
  1. slow_query_log = 1 - schaltet das Log ein.
  2. long_query_time = 1 - Schwellenwert in Sekunden; Dezimalwerte wie 0.5 sind möglich.
  3. slow_query_log_file - Zieldatei des Logs.
  4. log_queries_not_using_indexes = 1 - protokolliert zusätzlich Abfragen ohne Indexnutzung.

MariaDB ab 10.11 nennt die Variablen log_slow_query, log_slow_query_time und log_slow_query_file; die alten Namen funktionieren weiter. Speichern Sie die Datei und starten Sie den Dienst neu.

sudo systemctl restart mysql
# Bei MariaDB ggf.:
sudo systemctl restart mariadb

Verifizieren: SHOW VARIABLES LIKE 'slow_query_log%'; zeigt ON und den Pfad /var/log/mysql/slow.log, und ls -l /var/log/mysql/slow.log zeigt eine Datei mit Besitzer mysql.

Schritt 3: Slow Query Log zur Laufzeit aktivieren (ohne Neustart)

Um das Log ohne Neustart zu aktivieren, setzen Sie die Variablen dynamisch. Den Pfad können Sie auch bei aktivem Log ändern; der Server schließt dann die alte Datei und öffnet die neue.

SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
SET GLOBAL long_query_time = 1;
SET GLOBAL log_queries_not_using_indexes = 'ON';
SET GLOBAL slow_query_log = 'ON';

Wichtig: long_query_time wird nur für neue Verbindungen wirksam. Laufzeitwerte gehen beim Neustart verloren; dauerhaft gilt der Eintrag aus Schritt 2.

Verifizieren: SELECT @@GLOBAL.slow_query_log, @@GLOBAL.long_query_time; liefert 1 und 1.000000.

Schritt 4: Last erzeugen und Verifikation

Prüfen Sie jetzt, ob tatsächlich Einträge geschrieben werden. Öffnen Sie dafür eine neue Verbindung, damit der neue Schwellenwert gilt, und erzeugen Sie eine langsame Abfrage.

SELECT SLEEP(2);

Diese Abfrage dauert zwei Sekunden und überschreitet den Schwellenwert. Sehen Sie nun in die Logdatei.

sudo tail -n 30 /var/log/mysql/slow.log

Ein typischer Eintrag sieht so aus:

# Time: 2026-05-31T10:14:22.123456Z
# User@Host: app[app] @ localhost []
# Query_time: 2.000312  Lock_time: 0.000045 Rows_sent: 1  Rows_examined: 0
SET timestamp=1780222462;
SELECT SLEEP(2);

Verifizieren: Die Datei enthält einen Eintrag mit SELECT SLEEP(2); und Query_time von etwa 2 Sekunden.

Achten Sie besonders auf Query_time und Rows_examined: Ein großer Wert bei Rows_examined im Verhältnis zu Rows_sent ist ein Zeichen für einen fehlenden Index.

Schritt 5: Langsame MySQL Abfragen finden mit mysqldumpslow

Bei produktiver Last wächst das Log schnell. Statt manuell zu lesen, nutzen Sie mysqldumpslow (unter MariaDB auch mariadb-dumpslow); es fasst identische Abfragemuster zusammen und zeigt die teuersten Queries sortiert an.

mysqldumpslow -s at -t 10 /var/log/mysql/slow.log
  1. -s at - sortiert nach durchschnittlicher Query-Zeit. Alternativen: -s t, -s c, -s ar.
  2. -t 10 - zeigt die Top 10.
  3. -g "PATTERN" - filtert auf einen Suchausdruck.
  4. -a - behält Zahlen/Strings statt sie zu abstrahieren.

Eine einzeln schnelle, aber sehr oft laufende Abfrage ist oft das eigentliche Problem (N+1):

mysqldumpslow -s c -t 10 /var/log/mysql/slow.log

Verifizieren: Die Ausgabe beginnt mit Reading mysql slow query log from /var/log/mysql/slow.log und listet Blöcke mit Count: … Time=… je Abfragemuster.

Schritt 6: EXPLAIN Abfrage analysieren

Für einen Kandidaten aus dem Log untersuchen Sie den Ausführungsplan mit EXPLAIN.

EXPLAIN SELECT * FROM orders WHERE customer_id = 42 AND status = 'open';
  1. type - Zugriffsart. ALL ist Tabellenscan (schlecht), ref/eq_ref ist Indexnutzung (gut).
  2. key - genutzter Index. NULL bedeutet kein Index.
  3. rows - geschätzte untersuchte Zeilen.
  4. Extra - Using filesort/Using temporary deuten auf Optimierungspotenzial.

Für eine Baumsicht mit echten Laufzeitwerten nutzen Sie unter MySQL 8 EXPLAIN ANALYZE (unter MariaDB heißt das Gegenstück ANALYZE SELECT …):

EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 42 AND status = 'open';

Fehlt ein Index, legen Sie ihn gezielt an:

CREATE INDEX idx_orders_customer_status ON orders (customer_id, status);

Verifizieren: Ein erneutes EXPLAIN zeigt bei key den Index idx_orders_customer_status, type ist ref und rows deutlich kleiner als vorher.

Schritt 7: Updates, Wartung und Backup

Logrotation einrichten

Das Slow Query Log wächst dauerhaft. Viele Distributionen liefern /etc/logrotate.d/mysql-server mit. Nach einer Rotation muss MySQL in die neue Datei schreiben. Das erledigt ein Flush aller Logs oder gezielt nur des Slow Logs per SQL (FLUSH SLOW LOGS;):

mysqladmin flush-logs
# nur das Slow Query Log, MySQL 8:
mysqladmin flush-logs slow
# nur das Slow Query Log, MariaDB:
mariadb-admin flush-slow-log

Schwellenwert anpassen

Nach der ersten Runde senken Sie long_query_time schrittweise (z. B. auf 0.5). Deaktivieren Sie log_queries_not_using_indexes wieder, sobald die Grundproblematik behoben ist.

Backup nicht vergessen

Bevor Sie Indizes auf produktiven Tabellen ändern, sichern Sie die Datenbank:

mysqldump --single-transaction --routines --triggers \
  -u root -p meinedatenbank > /backup/meinedatenbank_$(date +%F).sql

Index-Änderungen sind umkehrbar (DROP INDEX), aber ein frisches Backup gehört vor jeden Eingriff am Schema. Automatisierte Sicherungen beschreibt unsere Anleitung MySQL- und PostgreSQL-Backup automatisieren.

Verifizieren: sudo logrotate -d /etc/logrotate.d/mysql-server läuft ohne Fehlermeldung durch, und die Backup-Datei unter /backup/ ist größer als 0 Byte.

Troubleshooting

  1. Das Log bleibt leer: Prüfen Sie mit SHOW VARIABLES LIKE 'slow_query_log';, ob es ON ist. Häufig wurde der Block unter [mysql] statt [mysqld] gesetzt.
  2. Keine Schreibrechte: Das Verzeichnis gehört meist nicht dem MySQL-Benutzer. Setzen Sie chown mysql:mysql /var/log/mysql. Bei AppArmor/SELinux muss der Pfad freigegeben sein.
  3. Keine neuen Einträge: Nach einer Rotation schreibt MySQL in den alten Inode. mysqladmin flush-logs behebt das.
  4. long_query_time ignoriert: Der globale Wert gilt nur für neue Verbindungen. Verbinden Sie sich neu.
  5. mysqldumpslow nicht gefunden: Installieren Sie unter Debian/Ubuntu mysql-client bzw. mariadb-client.

Häufige Fragen

Verlangsamt das Slow Query Log die Datenbank?

Der Overhead ist gering, solange Sie in eine Datei loggen und einen sinnvollen Schwellenwert wählen. long_query_time = 0 protokolliert jede Abfrage und kann Leistung kosten. 0,5 bis 1 Sekunde ist ein guter Kompromiss.

Worin unterscheidet sich das Slow Query Log vom General Query Log?

Das General Query Log protokolliert jede Abfrage und ist nur für kurzes Debugging gedacht. Das Slow Query Log erfasst gezielt die langsamen Abfragen und ist das richtige Werkzeug für die dauerhafte Performance-Analyse.

Funktioniert das auch mit MariaDB?

Ja. MariaDB versteht dieselben Variablennamen (ab 10.11 zusätzlich die neuen Namen log_slow_query*) und liefert mariadb-dumpslow bzw. mysqldumpslow mit. Der Dienstname lautet mariadb, statt EXPLAIN ANALYZE nutzen Sie ANALYZE SELECT ….

Wie finden Sie N+1-Queries im Log?

Sortieren Sie mysqldumpslow mit -s c nach Aufrufanzahl. Eine einzeln schnelle, aber tausendfach ausgeführte identische Abfrage ist das typische N+1-Muster und sollte gebündelt werden (Eager Loading oder JOIN).

Müssen Sie nach jeder Index-Änderung neu messen?

Ja. Führen Sie nach jedem Eingriff erneut EXPLAIN aus und beobachten Sie das Log über einen realen Lastzeitraum. Indizes beschleunigen Lesezugriffe, verlangsamen Schreibvorgänge minimal.

Fazit

Das Slow Query Log liefert Fakten, um langsame MySQL-Abfragen zu finden und zu beheben. Der Ablauf: Log aktivieren, mit mysqldumpslow zusammenfassen, mit EXPLAIN prüfen, Indizes ergänzen. Wiederholen Sie den Zyklus mit gesenktem Schwellenwert.

Weiterführende Anleitungen

Die Grundinstallation beschreibt die Anleitung MariaDB / MySQL installieren und absichern. Betreiben Sie auch PostgreSQL, lohnt sich ein Blick auf unseren Beitrag zum PostgreSQL 18.4 Sicherheitsupdate (CVE-2026-6473/6475). Weitere Beiträge finden Sie in unserer Kategorie Datenbanken.

Quellen

Die verwendeten Optionen und Befehle stammen aus der offiziellen Dokumentation: MySQL Reference Manual - The Slow Query Log, MySQL Reference Manual - mysqldumpslow sowie MariaDB Knowledge Base - Slow Query Log Overview.