Kural
Kaçın gereksiz veritabanı dizini
Çakışan veritabanı dizini boşa
depolama ve yavaş yavaşlatma yazma işlemlerini.
Desteklenen diller: SQLGiriş
Yedekli dizinler, birden fazla dizin aynı sütunları kapsadığında veya bir dizin diğerinin önekini oluşturduğunda ortaya çıkar. Her dizin disk alanı kaplar ve INSERT, UPDATE ve DELETE işlemleri sırasında güncellenmesi gerekir. Benzer sütunlarda beş adet çakışan dizine sahip bir tablo, yazma performansında beş kat daha fazla kayıp yaşarken, okuma optimizasyonu için tek bir dizin yeterli olur.
Neden önemli?
Performans üzerindeki etkisi: Her dizin, yazma işlemlerini yavaşlatır; çünkü veriler değiştiğinde veritabanının tüm dizinleri güncellemesi gerekir. Gereksiz dizinler, sorgu performansında herhangi bir fayda sağlamadan bu yükü kat kat artırır. Üzerinde üç gereksiz dizin bulunan bir tablo kullanıcı_kimliği Yazma yükü üç katına çıkar, oysa hiçbir zaman yalnızca bir dizin kullanılır.
Depolama maliyetleri: Dizinler, dizine eklenmiş sütun boyutları ve satır sayılarıyla orantılı olarak disk alanı tüketir. Gereksiz dizinler, gerçek veriler veya yararlı dizinler için kullanılabilecek depolama alanını boşa harcar. Gereksiz dizinler içeren büyük tablolar, gigabaytlarca depolama alanını boşa harcayabilir.
Bakım karmaşıklığı: Dizin sayısı arttıkça, izlenmesi, analiz edilmesi ve bakımı yapılması gereken nesnelerin sayısı da artar. Veritabanı yöneticileri, hiçbir fayda sağlamayan dizinleri optimize etmek için zaman harcarlar. Sorgu planlayıcıları, değerlendirmeleri gereken daha fazla seçenekle karşı karşıya kalır ve bu da optimal olmayan yürütme planlarının seçilmesine yol açabilir.
Kod örnekleri
❌ Uygun değil:
-- users tablosundaki gereksiz dizinler
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_email_status ON users(e-posta, durum);
CREATE INDEX idx_users_created ON users(created_at);
CREATE INDEX idx_users_created_status ON users(created_at, status);
-- Tek sütunlu dizinler gereksizdir çünkü
-- bileşik dizinler aynı sorguları karşılayabilir
Neden yanlış: E-posta ile ilgili endeks gereksizdir çünkü idx_users_email_status şöyle başlar: e-posta ve yalnızca e-posta adresine göre filtreleme yapan sorguları işleyebilir. Benzer şekilde, idx_users_created şununla aynı anlama gelir: idx_users_created_status. Bu tabloya yapılan her ekleme veya güncelleme, iki dizin yeterli olurken dört dizini güncelliyor.
✅ Uygunluk:
-- users tablosundaki dizinler optimize edildi
CREATE INDEX idx_users_email_status ON users(email, status);
CREATE INDEX idx_users_created_status ON users(created_at, status);
-- Bileşik dizinler, önek sütunları üzerinden sorgulara hizmet edebilir
-- Yalnızca e-posta sütununa yönelik sorgular idx_users_email_status dizinini kullanır
-- Yalnızca created_at sütununa yönelik sorgular idx_users_created_status dizinini kullanır
Bunun önemi: İki bileşik dizin, tüm sorgu kalıplarını karşılarken gereksiz tekrarları ortadan kaldırır. Aşağıdakilere göre filtreleme yapan sorgular: e-posta yalnızca ilk dizini kullanır ve şu kriterlere göre filtreleme yapan sorgular oluşturulma_tarihi Sadece ikincisini kullanın. Dört yerine sadece iki dizin güncellenmesi gerektiği için yazma performansı artar.
Sonuç
Veritabanı dizinlerinizi düzenli olarak denetleyerek gereksiz olanları tespit edin. Diğer dizinlerin önekleri olan veya kapsama alanını çakışan dizinleri kaldırın. Bileşik dizinler, öndeki sütunlarına göre sorguları işleyebilir; bu sayede çoğu durumda ayrı tek sütunlu dizinlere gerek kalmaz.

