Aikido

Neden gereksiz veritabanı dizinlerinden kaçınılmalı: depolama ve yazma performansının optimize edilmesi

Performans

Kural

Kaçın gereksiz veritabanı dizini
Çakışan veritabanı dizini boşa
depolama ve yavaş yavaşlatma yazma işlemlerini.

Desteklenen diller: SQL

Giriş

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.

Sık Sorulan Sorular

Sorularınız mı var?

Veritabanımdaki gereksiz dizinleri nasıl tespit edebilirim?

Veritabanınızın sistem tablolarını sorgulayarak tüm dizinleri listeleyin. PostgreSQL için pg_indexes görünümünü kullanın. MySQL için ise SHOW INDEX FROM table_name komutunu kullanın. Bir dizin diğerinin öneki olan (örneğin, email ile email+status) veya birden fazla dizinin aynı sütunları farklı sıralamalarda kapsadığı durumları arayın.

Tek sütunlu bir dizin, ne zaman bileşik bir dizinle çakışmaz?

Sorgu seçiciliğinin önemli olduğu durumlar. Bir bileşik dizinin yalnızca ikinci sütununu sık sık sorguluyorsanız, bu sorgu dizini verimli bir şekilde kullanamaz. (status, email) üzerinde oluşturulan bir dizin, yalnızca e-posta adresine göre filtreleme yapan sorgulara yardımcı olmaz. Ancak, (email, status) üzerinde oluşturulan bir dizin, yalnızca e-posta adresine dayalı sorgulara hizmet edebilir.

Yedek dizinler sorgu performansını nasıl etkiler?

Okuma işlemleri için etkisi minimum düzeyde, yazma işlemleri için ise oldukça belirgindir. Sorgu planlayıcı, gereksiz dizinler arasında seçim yapabilir, ancak yürütme süresi benzerdir. Bununla birlikte, her yazma işlemi (INSERT, UPDATE, DELETE) tüm dizinleri güncellemek zorundadır ve bu da I/O işlemlerini kat kat artırır. Yazma işlemlerinin yoğun olduğu tablolarda, gereksiz dizinlerin kaldırılması verimi %20-50 oranında artırabilir.

Bileşik dizinlerim varsa, tek sütunlu tüm dizinleri kaldırmalı mıyım?

Her zaman değil. Tek sütunlu dizin yüksek seçiciliğe sahipse ve sıklıkla tek başına sorgulanıyorsa, onu koruyun. Hangi dizinlerin gerçekten kullanıldığını görmek için veritabanı sorgu istatistiklerini kullanın. Kullanım oranı sıfır olan veya çok düşük olan dizinleri silin. Modern veritabanları, sistem görünümlerinde dizin kullanımını 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.