Die teuersten Abfragen finden (performance_schema digest)
MySQLPerformanceBefehl
SELECT SCHEMA_NAME AS db,
LEFT(DIGEST_TEXT, 80) AS query,
COUNT_STAR AS calls,
ROUND(SUM_TIMER_WAIT / 1e12, 2) AS total_sec,
ROUND(AVG_TIMER_WAIT / 1e9, 2) AS avg_ms,
ROUND(QUANTILE_95 / 1e9, 2) AS p95_ms,
ROUND(100 * SUM_TIMER_WAIT / SUM(SUM_TIMER_WAIT) OVER (), 1) AS pct_total,
ROUND(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0)) AS rows_exam_per_call,
ROUND(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0)) AS rows_sent_per_call,
SUM_NO_INDEX_USED AS no_index,
SUM_CREATED_TMP_DISK_TABLES AS tmp_disk,
LAST_SEEN
FROM performance_schema.events_statements_summary_by_digest
WHERE SCHEMA_NAME IS NOT NULL
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 20;
-- Server-wide top wait events
SELECT events, total, total_latency, avg_latency FROM sys.waits_global_by_latency LIMIT 10;Was es tut
Ordnet normalisierte Abfragen nach Gesamtzeit mit Aufrufanzahl, durchschnittlicher und p95-Latenz, Anteil an der Gesamtzeit, untersuchten / gesendeten Zeilen pro Aufruf, Ausführungen ohne Index und auf Platte ausgelagerten temporären Tabellen. Die zweite Abfrage zeigt, auf welche Waits (IO, Sperren, Redo) die Zeit entfällt.
Wann einsetzen
Erste Anlaufstelle, wenn CPU- / IO-Last steigt oder Benutzer melden 'die Datenbank ist langsam'; funktioniert auch bei ausgeschaltetem Slow Log.
Vorsicht
Die Werte kumulieren seit dem letzten Neustart oder TRUNCATE TABLE performance_schema.events_statements_summary_by_digest; erstelle zwei Snapshots und vergleiche sie, um die aktuelle Aktivität zu sehen. Die Tabelle ist auf performance_schema_digests_size Zeilen begrenzt; ist sie voll, werden neue Abfragen in einer einzigen Zeile mit NULL-DIGEST zusammengefasst. DIGEST_TEXT wird bei performance_schema_max_digest_length (1024) Bytes abgeschnitten. Zeiten sind in Pikosekunden angegeben. Ein hohes Verhältnis rows_exam_per_call / rows_sent_per_call ist das deutlichste Zeichen für einen fehlenden Index.
Verwandte Einträge
- Was läuft gerade: aktive Sessions, Latenz, Sperren und Transaktionen (sys.session)
- 'Waiting for table metadata lock' diagnostizieren und den eigentlichen Blocker finden
- InnoDB-Deadlocks analysieren und alle protokollieren
- Lang laufende Transaktionen und History List Length (Purge-Rückstand)
- Kurzzeitig ein vollständiges Slow Log aufzeichnen und mit pt-query-digest analysieren
- Einen schlechten Plan mit EXPLAIN ANALYZE und dem Optimizer Trace untersuchen