MySQL'de yavaş bir sorguya indeks eklemeden önce veritabanının sorguyu nasıl çalıştırdığını görmek gerekir. EXPLAIN tahmini planı gösterir; EXPLAIN ANALYZE ise sorguyu gerçekten çalıştırır ve her adım için ölçülen süre ile satır sayılarını ekler.
Üretimde önce normal EXPLAIN kullanın
EXPLAIN FORMAT=TREE
SELECT o.id, o.created_at
FROM orders AS o
WHERE o.customer_id = 42
ORDER BY o.created_at DESC
LIMIT 20;
EXPLAIN ANALYZE sorguyu yürüttüğü için pahalı veya veri değiştiren ifadelerde dikkatsizce kullanılmamalıdır. Önce kopya veri, staging veya düşük riskli bir SELECT üzerinde çalışın.
Tahmini ve gerçek satırları karşılaştırın
EXPLAIN ANALYZE
SELECT o.id, o.created_at
FROM orders AS o
WHERE o.customer_id = 42
ORDER BY o.created_at DESC
LIMIT 20;
Ağaç çıktısında her düğümde rows tahmini ile actual ... rows değerini karşılaştırın. Büyük farklar güncelliğini yitirmiş istatistikleri, ilişkili sütunları veya dağılımı eşit olmayan veriyi işaret edebilir.
actual time ve loops alanlarını birlikte okuyun
actual time=0.100..25.000 rows=20 loops=1 biçiminde ilk değer ilk satıra, ikinci değer tüm satırların tamamlanmasına kadar geçen ortalama süreyi gösterir. Bir düğüm binlerce kez çalışıyorsa küçük görünen süreyi loops sayısıyla birlikte değerlendirin.
Table scan her zaman hata değildir
Küçük tablonun tamamını okumak indeks erişiminden ucuz olabilir. Sorun, büyük tablonun çok sayıda satırını okuyup az sayıda satır döndürmesi veya filtrelemenin geç aşamada yapılmasıdır. Mevcut indeksleri kontrol edin:
SHOW INDEX FROM orders;
ANALYZE TABLE orders;
Örnekte (customer_id, created_at) birleşik indeksi filtreleme ve sıralamayı birlikte destekleyebilir; fakat gerçek sorgu yükü ve yazma maliyeti değerlendirilmeden eklenmemelidir.
Değişikliği aynı veriyle yeniden ölçün
İndeks veya sorgu değişikliğinden sonra planı tekrar alın. Hedef yalnızca “index scan” görmek değil; okunan satır, döngü ve toplam çalışma süresinin düşmesidir. Önbellek etkisini azaltmak için tek ölçüm yerine benzer koşullarda birkaç çalışma karşılaştırın.
Başvuru: MySQL 8.4 EXPLAIN kılavuzu.