Aikido

Gereksiz veritabanı indekslerinden neden kaçınılmalıdır: depolama ve yazma performansını optimize etme

Performans

Kural

Gereksiz veritabanı indekslerinden kaçının.
Örtüşen veritabanı indeksleri depolama
alanı harcar ve yazma işlemlerini yavaşlatır.

Desteklenen diller: SQL

Giriş

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.

Sık Sorulan Sorular

Sorularınız mı var?

Veritabanımdaki gereksiz indeksleri nasıl tespit edebilirim?

Tüm indeksleri listelemek için veritabanınızın sistem tablolarını sorgulayın. PostgreSQL için pg_indexes görünümünü kullanın. MySQL için SHOW INDEX FROM table_name komutunu kullanın. Bir indeksin diğerinin ön eki olduğu (email ve email+status) veya birden fazla indeksin aynı sütunları farklı sırayla kapsadığı durumları arayın.

Tek sütunlu bir indeks, bileşik bir indeksle ne zaman gereksiz (redundant) hale gelmez?

Sorgu seçiciliği (selectivity) önemli olduğunda. Bir bileşik indeksin yalnızca ikinci sütununu sık sık sorguluyorsanız, bu sorgu indeksi verimli bir şekilde kullanamaz. (status, email) üzerinde oluşturulan bir indeks, yalnızca e-posta adresine göre filtreleme yapan sorgulara yardımcı olmaz. Ancak (email, status) üzerindeki bir indeks, yalnızca e-postaya yönelik sorguları karşılayabilir.

Gereksiz indeksler sorgu performansını nasıl etkiler?

Okuma işlemlerinde çok az, yazma işlemlerinde ise belirgin ölçüde etkiler. Sorgu planlayıcı (query planner) gereksiz indeksler arasında seçim yapabilir ancak yürütme süresi benzerdir. Bununla birlikte, her yazma işlemi (INSERT, UPDATE, DELETE) tüm indeksleri güncellemek zorunda kalarak I/O işlemlerini katlar. Yazma yoğunluklu tablolar için gereksiz indekslerin kaldırılması, aktarım hızını (throughput) %20-50 oranında artırabilir.

Bileşik indekslerim varsa tek sütunlu indekslerin tümünü kaldırmalı mıyım?

Her zaman değil. Tek sütunlu indeks yüksek seçiciliğe sahipse ve yalnızca kendisine sıkça sorgu atılıyorsa onu saklayın. Hangi indekslerin gerçekten kullanıldığını görmek için veritabanı sorgu istatistiklerini kullanın. Sıfır veya çok düşük kullanım oranına sahip indeksleri silin. Modern veritabanları, indeks kullanımını sistem görünümlerinde (system views) takip eder.

Şimdi güvenliğinizi sağlayın

Kodunuzu, bulutunuzu ve çalışma zamanınızı tek bir merkezi sistemde güvenceye alın.
Güvenlik açıklarını otomatik olarak hızla bulun ve düzeltin.

Kredi kartı gerekmez | Tarama sonuçları 32 saniyede.