📄
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:
| Type | Açıklama | Performans |
|---|---|---|
system | Tek satırlık tablo | 🟢 En iyi |
const | PK veya UNIQUE ile tek satır | 🟢 Çok iyi |
eq_ref | JOIN'de PK/UNIQUE eşleşmesi | 🟢 Çok iyi |
ref | Index kullanılarak eşleşme | 🟢 İyi |
range | Index aralık taraması | 🟡 Orta-İyi |
index | Tam index taraması | 🟡 Orta |
ALL | Tam 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
| Extra | Anlamı | |
|---|---|---|
Using index | Covering index — tabloya gitmeden sonuç | 🟢 |
Using where | WHERE filtresi uygulanıyor | ⚪ Normal |
Using filesort | Bellek/disk sıralama gerekli | 🟡 |
Using temporary | Geçici tablo gerekli | 🔴 |
Using index condition | Index 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
AI Asistan
Sorularını yanıtlamaya hazır