SQL'de indeks nedir? Yavaş sorguyu EXPLAIN ile bulup hızlandırmak
Veritabanındaki tablo büyüdükçe birkaç milisaniyede dönen sorgular saniyeler sürmeye başlayabilir. Bunun en yaygın nedeni doğru indeksin olmamasıdır.
İndeks nedir?
İndeks, bir kitabın sonundaki dizine benzer. Dizin yoksa bir kelimeyi bulmak için tüm sayfaları okumak gerekir; veritabanında buna tam tablo taraması (full table scan) denir. İndeks olduğunda veritabanı aradığı satırlara doğrudan gider.
CREATE INDEX idx_siparis_musteri ON siparis (musteri_id);
EXPLAIN ile sorguyu incelemek
Bir sorgunun nasıl çalıştırılacağını görmek için başına EXPLAIN ekle:
EXPLAIN SELECT * FROM siparis WHERE musteri_id = 42;
MySQL/MariaDB'de dikkat edilecek sütunlar:
- type:
ALLtam tablo taraması demektir, büyük tablolarda kötü işarettir.ref,range,constiyidir. - key: Kullanılan indeks.
NULLise indeks kullanılmıyor. - rows: Taranacak tahmini satır sayısı.
PostgreSQL'de EXPLAIN ANALYZE sorguyu gerçekten çalıştırıp süreleri de gösterir; "Seq Scan" ifadesi tam tablo taramasıdır.
Hangi sütunlara indeks konmalı?
WHEREkoşullarında sık kullanılan sütunlarJOINyapılan yabancı anahtar sütunlarıORDER BYile sıralanan sütunlar
Bileşik indeks ve sıra
WHERE durum = 'aktif' AND olusturma > '2026-01-01' gibi sorgular için iki sütunlu indeks tek tek indekslerden daha etkilidir:
CREATE INDEX idx_durum_tarih ON siparis (durum, olusturma);
Sıra önemlidir: Bu indeks yalnızca durum ile yapılan aramada da kullanılır, ama yalnızca olusturma ile yapılan aramada genellikle kullanılmaz. Eşitlik koşulundaki sütunu öne, aralık koşulundakini arkaya koy.
İndeksi işe yaramaz hale getiren durumlar
- Sütuna fonksiyon uygulamak:
WHERE YEAR(olusturma) = 2026yerineWHERE olusturma >= '2026-01-01' AND olusturma < '2027-01-01'yaz. - Başında joker olan LIKE:
LIKE '%ahmet'indeks kullanamaz,LIKE 'ahmet%'kullanabilir. - Tip uyuşmazlığı: Metin sütununu sayıyla karşılaştırmak.
Her şeye indeks koymak çözüm değil
Her indeks ekleme, güncelleme ve silme işlemlerini biraz yavaşlatır ve disk kaplar. Gerçekten kullanılan sorgulara göre indeks ekle.
Yavaş çalışan bir sorgun varsa sorguyu, tablo yapısını (SHOW CREATE TABLE) ve EXPLAIN çıktısını bu konunun altına ekleyebilirsin. Paylaşmadan önce gerçek müşteri verilerini çıkarmayı unutma.