← Kursa Dön
📄 Text · 35 min

EXPLAIN ile Sorgu Analizi

Giriş — Sorgunun Röntgenini Çekmek

EXPLAIN, MySQL'in bir sorguyu nasıl çalıştıracağını gösterir — hangi index kullanılacak, kaç satır taranacak, hangi JOIN stratejisi uygulanacak. Performans optimizasyonunun en önemli aracıdır.


EXPLAIN Kullanımı

EXPLAIN SELECT * FROM customers WHERE city = 'İstanbul';
+----+-------------+-----------+------+---------------+----------+---------+-------+------+-------+
| id | select_type | table     | type | possible_keys | key      | key_len | ref   | rows | Extra |
+----+-------------+-----------+------+---------------+----------+---------+-------+------+-------+
| 1  | SIMPLE      | customers | ref  | idx_city      | idx_city | 203     | const | 4    |       |
+----+-------------+-----------+------+---------------+----------+---------+-------+------+-------+

Önemli EXPLAIN Sütunları

type — Erişim Türü (En Önemlisi!)

En iyiden en kötüye:

TypeAçıklamaPerformans
systemTek satırlık tablo🟢 En iyi
constPK veya UNIQUE ile tek satır🟢 Çok iyi
eq_refJOIN'de PK/UNIQUE eşleşmesi🟢 Çok iyi
refIndex kullanılarak eşleşme🟢 İyi
rangeIndex aralık taraması🟡 Orta-İyi
indexTam index taraması🟡 Orta
ALLTam tablo taraması🔴 En kötü
-- const: PK ile tek satır
EXPLAIN SELECT * FROM customers WHERE customer_id = 1;
-- type: const ✅

-- ALL: Full table scan (index yok)
EXPLAIN SELECT * FROM customers WHERE first_name = 'Ahmet';
-- type: ALL ❌ (first_name'de index yok)

rows — Taranacak Satır Tahmini

Düşük = iyi. 10 satır taramak, 1.000.000 satır taramaktan çok daha hızlı.

Extra — Ek Bilgiler

ExtraAnlamı
Using indexCovering index — tabloya gitmeden sonuç🟢
Using whereWHERE filtresi uygulanıyor⚪ Normal
Using filesortBellek/disk sıralama gerekli🟡
Using temporaryGeçici tablo gerekli🔴
Using index conditionIndex condition pushdown🟢

EXPLAIN ANALYZE (MySQL 8.0.18+)

Sorguyu gerçekten çalıştırır ve gerçek süreleri gösterir:

EXPLAIN ANALYZE SELECT c.first_name, COUNT(o.order_id)
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.first_name;

EXPLAIN Format Seçenekleri

-- Tablo formatı (varsayılan)
EXPLAIN SELECT ...;

-- JSON formatı (detaylı)
EXPLAIN FORMAT=JSON SELECT ...;

-- Tree formatı (MySQL 8.0+)
EXPLAIN FORMAT=TREE SELECT ...;

Optimizasyon Örnekleri

-- ❌ Full table scan — index yok
EXPLAIN SELECT * FROM products WHERE product_name LIKE '%Mouse%';
-- type: ALL, rows: 15 (tüm tablo)

-- ❌ Fonksiyon index'i bozar
EXPLAIN SELECT * FROM orders WHERE YEAR(order_date) = 2024;
-- type: ALL (YEAR() fonksiyonu index kullanımını engeller)

-- ✅ Index kullanılabilir sorgu
EXPLAIN SELECT * FROM orders WHERE order_date >= '2024-01-01' AND order_date < '2025-01-01';
-- type: range (index kullanılır)

Özet

  • EXPLAIN sorgunun execution plan'ını gösterir — performans analizinin temeli

  • type sütunu en önemli gösterge: const > ref > range > ALL

  • ALL (full table scan) gördüğünde index eklemeyi düşün

  • rows düşük olmalı, Extra'da Using filesort/temporary olmamalı

  • EXPLAIN ANALYZE gerçek çalışma sürelerini gösterir

  • WHERE'de fonksiyon kullanmak index'i devre dışı bırakır