DBAtlas · Veritabanı operasyon atlası

EXPLAIN ANALYZE ve optimizer trace ile kötü planı çöz

MySQLPerformans

Komut

-- 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.

DBAtlas'ta aç →

İlgili