Kural
Gereksiz veritabanı indekslerinden kaçının.
Örtüşen veritabanı indeksleri depolama
alanı harcar ve yazma işlemlerini yavaşlatır.
Desteklenen diller: SQLGiriş
Gereksiz indeksler, birden fazla indeks aynı sütunları kapsadığında veya bir indeks diğerinin öneki olduğunda ortaya çıkar. Her indeks disk alanı tüketir ve INSERT, UPDATE ve DELETE işlemlerinde güncellenmelidir. Benzer sütunlar üzerinde örtüşen beş indekse sahip bir tablo, okuma optimizasyonu için tek bir indeks yeterli olacakken, yazma performansı cezasını beş kez öder.
Neden önemli?
Performans etkisi: Her indeks yazma işlemlerini yavaşlatır çünkü veritabanı veriler değiştiğinde tüm indeksleri güncellemek zorundadır. Gereksiz indeksler, sorgu avantajı sağlamadan bu maliyeti katlar. Şu özelliklere sahip üç gereksiz indeks içeren bir tablo: user_id yazma ek yükünü üçe katlar, oysa bunlardan yalnızca biri kullanılır.
Depolama maliyetleri: İndeksler, indekslenen sütun boyutları ve satır sayılarıyla orantılı olarak disk alanı tüketir. Gereksiz indeksler, gerçek veriler veya faydalı indeksler için kullanılabilecek depolama alanını boşa harcar. Gereksiz indekslere sahip büyük tablolar gigabaytlarca depolama alanını harcayabilir.
Bakım karmaşıklığı: Daha fazla indeks, izlenecek, analiz edilecek ve bakımı yapılacak daha fazla nesne anlamına gelir. Veritabanı yöneticileri hiçbir değer sağlamayan indeksleri optimize etmek için zaman harcar. Sorgu planlayıcıların değerlendireceği daha fazla seçeneği olur ve potansiyel olarakoptimal olmayan yürütme planları seçebilirler.
Kod örnekleri
❌ Kural dışı:
-- users tablosundaki gereksiz indeksler
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_email_status ON users(email, status);
CREATE INDEX idx_users_created ON users(created_at);
CREATE INDEX idx_users_created_status ON users(created_at, status);
-- Tek sütunlu indeksler gereksizdir çünkü
-- bileşik indeksler aynı sorgulara hizmet edebilir
Neden yanlış: E-posta üzerindeki indeks gereksizdir çünkü idx_users_email_status ile başlar email ve yalnızca e-faktörüne göre filtreleme yapan sorguları işleyebilir. Benzer şekilde, idx_users_created ile idx_users_created_statusarasında gereksiz bir örtüşme vardır. Bu tabloya yapılan her ekleme veya güncelleme, ikisi yeterli olacakken dört indeksi günceller.
✅ Kurallara uygun:
-- users tablosundaki optimize edilmiş indeksler
CREATE INDEX idx_users_email_status ON users(email, status);
CREATE INDEX idx_users_created_status ON users(created_at, status);
-- Bileşik indeksler, ön ek sütunlarındaki sorgulara hizmet edebilir
-- Yalnızca e-posta üzerindeki sorgular idx_users_email_status kullanır
-- Yalnızca created_at üzerindeki sorgular idx_users_created_status kullanır
Neden önemli: İki bileşik indeks (composite index), gereksiz tekrarları önlerken tüm sorgu desenlerini karşılar. Yalnızca şu sütuna göre filtreleme yapan sorgular email birinci indeksi kullanırken, yalnızca şu sütuna göre filtreleme yapan sorgular created_at ikinci indeksi kullanır. Dört indeks yerine yalnızca iki indeksin güncellenmesi gerekeceği için yazma performansı (write performance) iyileşir.
Sonuç
Gereksiz indeksleri tespit etmek için veritabanı indekslerinizi düzenli olarak denetleyin. Diğer indekslerin ön eki (prefix) olan veya aynı kapsamı yineleyen indeksleri kaldırın. Bileşik indeksler, kendi ön ek sütunlarındaki sorguları karşılayabildiğinden, çoğu durumda ayrı tek sütunlu indekslere duyulan ihtiyacı ortadan kaldırır.

