EXPLAIN ANALYZE ve optimizer trace ile kötü planı çöz
MySQLPerformansKomut
-- Plan + gercek sure ve satir (sorgu gercekten calisir)
EXPLAIN ANALYZE
SELECT region, COUNT(*) FROM shop.big WHERE id < 20000 GROUP BY region;
-- Optimizer neden bu plani secti: optimizer trace
SET SESSION optimizer_trace = 'enabled=on', SESSION optimizer_trace_max_mem_size = 1048576;
SELECT * FROM shop.big WHERE region = 'TR' AND id > 100 LIMIT 5;
SELECT JSON_PRETTY(JSON_EXTRACT(TRACE, '$**.considered_execution_plans')) AS plans,
MISSING_BYTES_BEYOND_MAX_MEM_SIZE
FROM information_schema.OPTIMIZER_TRACE;
SET SESSION optimizer_trace = 'enabled=off';Ne yapar?
EXPLAIN ANALYZE her plan adımı için tahmini (cost, rows) ve gerçekleşen (actual time, rows, loops) değerleri yan yana verir; optimizer trace değerlendirilen erişim yollarını, maliyetlerini ve neden seçilip elendiklerini gösterir.
Ne zaman kullanılır?
Sorgu aniden yavaşladığında (plan değişimi), optimizer yanlış index seçtiğinde veya tahmini / gerçek satır farkının kaynağını bulmak için.
Dikkat
EXPLAIN ANALYZE sorguyu gerçekten çalıştırır; ağır sorguda production'da dikkat. SELECT, TABLE ve çok tablolu UPDATE / DELETE ile çalışır. Tahmini ve gerçek rows arasında 10 kattan büyük fark istatistik / histogram sorununa işaret eder (ANALYZE TABLE, histogram). Nested loop'un iç tarafında actual rows tek bir loop içindir; toplam = rows × loops. MISSING_BYTES_BEYOND_MAX_MEM_SIZE > 0 ise trace kesilmiştir; optimizer_trace_max_mem_size'ı artır. Trace yalnız aynı oturumda son çalışan sorguyu tutar.
İlgili
- En pahalı sorguları bul (performance_schema digest)
- Şu anda ne çalışıyor: aktif oturumlar, süre, lock ve transaction (sys.session)
- 'Waiting for table metadata lock' teşhisi ve asıl bloklayanı bulma
- InnoDB deadlock analizi ve tüm deadlock'ları loglama
- Uzun açık transaction'lar ve history list length (purge gecikmesi)
- Slow log'u kısa süreli tam yakala ve pt-query-digest ile analiz et