Dizinler Ne Zaman Zararlıdır: Yazmalar ve Seçicilik
Yazma çoğalması ve seçiciliği düşük bir sütundaki dizinin neden işe yaramadığı.
Dizinler Ne Zaman Zararlıdır: Yazmalar ve Seçicilik, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding Interview Prep kursu toplamda 4 dersten oluşur.
Sorunun Ardındaki Soru
İndekslerin neden yararlı olduğunu anlatan üç dersten sonra mülakat yapanlar soruyu tersine çevirir: “Neden her sütunu indekslemeyelim?” Güçlü bir aday, indekslerin hem yazma işlemleri hem de önbellek ve depolama açısından gerçek maliyetleri olduğunu, ayrıca bazı indekslerin planlayıcı tarafından hiç kullanılmayacağını açıklar.
Bu derste bir indeksin zarar verebileceği iki temel nedeni ele alacağız: yazma çoğaltması ve düşük seçicilik.
Her İndeks Yazma İşlemlerini Yavaşlatır
Bir indeks tabloyla eşzamanlı kalmalıdır. Her INSERT, her DELETE ve indekslenen bir sütundaki her UPDATE işleminde indeks yapısı da güncellenmelidir. Buna yazma çoğaltması denir: tek bir satır değişikliği, bir tablo yazmasının yanı sıra etkilenen her indeks için bir yazma işlemesine dönüşür.
Sekiz indeksli bir tablo, indeksi olmayan bir tabloya kıyasla kabaca dokuz kat yazma işi yapar. Yazma ağırlıklı veya yüksek aktarım hızlı tablolarda bu ciddi bir yüktür.
Uygulamalı Örnek: Yazma Maliyeti
Saniyede binlerce satır alan bir etkinlikler tablosu düşünün. Eklenen her indeks, her ekleme işleminde daha fazla iş yapılmasına, indeks sayfalarının bölünmesine, yaprakların güncellenmesine ve önbellek için rekabete neden olur.
Yalnızca ekleme yapılan ve yazma ağırlıklı bir tablo için doğru yanıt çoğu zaman birincil anahtarın ötesinde az sayıda veya hiç indeks kullanmamak ve yoğun okuma işlemlerini bunun yerine bir çoğaltma sunucusunda ya da veri ambarında gerçekleştirmektir.
-- Each of these indexes adds cost to EVERY insert below
CREATE INDEX ix_events_user ON events (user_id);
CREATE INDEX ix_events_type ON events (event_type);
CREATE INDEX ix_events_ts ON events (created_at);
INSERT INTO events (user_id, event_type, created_at)
VALUES (42, 'click', now()); -- now updates table + 3 indexesSeçicilik Ne Anlama Gelir
Seçicilik, bir sütunun satırları ne kadar iyi ayırt ettiğidir; yani tipik bir değerin eşleştirdiği satırların oranıdır. Yüksek seçicilik, değer başına az sayıda satır anlamına gelir (e-posta veya UUID gibi). Düşük seçicilik ise değer başına çok sayıda satır anlamına gelir (boole değeri veya üç seçenekli bir durum gibi).
İndeksler, aramanın neredeyse her şeyi elemesi sayesinde yüksek seçiciliğe sahip sütunlarda yarar sağlar. Düşük seçiciliğe sahip sütunlarda ise çoğu zaman yarar sağlamaz.
Düşük Seçiciliğe Sahip Bir İndeks Neden İşe Yaramaz
Kullanıcıların %90'ı için is_active değerinin doğru olduğunu varsayalım. İndeks araması tablonun %90'ını döndürür; bu kadar çok satır için motorun her satırda bir yığın getirmesi gerekir ve bu, tabloyu tek geçişte ardışık olarak taramaktan daha yavaştır.
Bu nedenle planlayıcı indeksi doğru biçimde yok sayar ve ardışık tarama yapar. İndeks, okuma açısından hiç yarar sağlamadan yalnızca yazma ek yüküne ve depolama maliyetine neden olur.
-- 90% of rows match: the planner will likely skip this index
CREATE INDEX ix_users_active ON users (is_active);
SELECT * FROM users WHERE is_active = true;Yaklaşık Eşik
Sözlü olarak ifade edebileceğiniz yararlı bir pratik kural: bir koşul tablonun kabaca %5 ila %20'sinden fazlasını eşleştirdiğinde, ardışık tarama genellikle indeks taramasından daha iyi sonuç verir; çünkü rastgele yığın getirmelerinin maliyeti sayfaları sırayla akış hâlinde okumaktan daha yüksektir.
Kesin eşik satır boyutuna, önbelleğe alma durumuna ve depolama hızına bağlıdır. Bu nedenle planlayıcı karar verirken sabit bir sayı yerine istatistikleri kullanır.
Kısmi İndeksler İmdada Yetişir
Çarpık dağılıma sahip bir sütunun yalnızca nadir değerlerini sorguluyorsanız, kısmi indeks (PostgreSQL) yalnızca bu satırları indeksler; böylece küçük, seçici ve bakımı ucuz bir indeks elde edilir.
Siparişlerin %1'i pending durumundaysa ve sürekli sorguladığınız siparişler bunlarsa yalnızca onları indeksleyin. İndeks küçük kalır ve planlayıcı onu memnuniyetle kullanır.
-- Index only the rare, frequently-queried rows
CREATE INDEX ix_orders_pending
ON orders (created_at)
WHERE status = 'pending';Güncelliğini Yitirmiş İstatistikler Planlayıcıyı Yanıltır
İyileştirici, indeks ile tarama arasındaki seçimi sütun istatistiklerine göre yapar. Bu istatistikler toplu yükleme veya büyük bir güncelleme sonrasında güncelliğini yitirmişse, seçiciliği yanlış değerlendirebilir ve yanlış planı seçebilir.
Bir mülakat yapan “indeks var ama kullanılmıyor” dediğinde, indeksi suçlamadan önce ANALYZE ile istatistikleri yenilemeyi içeren güçlü bir yanıt verin.
ANALYZE orders; -- refresh planner statisticsİndekslerin Zarar Verdiği Diğer Durumlar
Yanıtınızı daha az bilinen maliyetlerle tamamlayın:
- Depolama ve önbellek: indeksler diskte yer kaplar ve bellek için rekabet ederek yararlı veri sayfalarını dışarı atar.
- Gereksiz veya örtüşen indeksler: bakımları yapılır, ancak hiç seçilmezler.
- Şişme: yoğun güncellemeler altında B-ağaçları parçalanır ve
REINDEXgerektirir. - İyileştirici karmaşası: birbirine benzeyen çok fazla indeks, planlamayı yavaşlatır ve daha az öngörülebilir hâle getirir.
Kullanılmayan İndeksleri Bulma
Gerçek dünyadaki bir temizlik çalışmasını savunmak için PostgreSQL'in indeks kullanımını izlediğini belirtin. idx_scan = 0 olan indeksler kaldırılmaya adaydır; hiçbir okumaya hizmet etmeden yazma işlemlerine ve depolama alanına maliyet getirirler.
SELECT relname AS table_name, indexrelname AS index_name, idx_scan
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY relname;Mülakatta Nasıl İfade Edilir
Eksiksiz ve dengeli bir özet:
“İndeksler yazma çoğaltmasına, yani her ekleme, güncelleme ve silme işleminde bakım gerektirmelerine ek olarak depolama ve önbellek baskısına da neden olur. Yalnızca yüksek seçiciliğe sahip koşullarda yarar sağlarlar; satırların çoğunun eşleştiği bir sütunda planlayıcı haklı olarak ardışık taramayı tercih eder, dolayısıyla indeks tamamen ek yüktür. Dağılımı çarpık sütunlarda kısmi indeksi tercih eder, istatistikleri ANALYZE ile güncel tutar ve kullanılmayan indeksleri kaldırırım.”
Hızlı Kontrol
Maliyetini karşılaması en az olası olan indeksi belirleyin.
Özet: İndeksler Ne Zaman Zarar Verir
Temel çıkarımlar:
- Her indeks, yazma çoğaltmasının yanı sıra depolama ve önbellek maliyeti getirir.
- İndeksler yüksek seçiciliğe sahip sütunlarda yararlıdır; düşük seçiciliğe sahip sütunlarda planlayıcı ardışık taramayı tercih eder.
- Eşleşen satırların oranı kabaca %5 ila %20'nin üzerine çıktığında tarama genellikle kazanır.
- Yalnızca nadir değerlerini sorguladığınız, dağılımı çarpık sütunlarda kısmi indeks kullanın.
- İstatistikleri
ANALYZEile güncel tutun ve kullanılmayan indeksleri kaldırın (idx_scan = 0).
İndeksleme stratejisi kursu burada tamamlanıyor: indeksleri işe yaradıkları yerlere oluşturun ve bunu planla kanıtlayın.
Sıkça Sorulan Sorular
“Dizinler Ne Zaman Zararlıdır: Yazmalar ve Seçicilik” dersi ücretsiz mi?
Evet — “Dizinler Ne Zaman Zararlıdır: Yazmalar ve Seçicilik” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding Interview Prep kursu toplamda 4 dersten oluşur.
“Dizinler Ne Zaman Zararlıdır: Yazmalar ve Seçicilik” dersinde ne öğreneceğim?
Yazma çoğalması ve seçiciliği düşük bir sütundaki dizinin neden işe yaramadığı. Coding Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Coding Interview Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Coding Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Dizinler Ne Zaman Zararlıdır: Yazmalar ve Seçicilik” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Coding Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- B-Ağacı Dizinleri ve Faydaları
- Bileşik Dizin Sütunlarının Sırası
- Kapsayıcı Dizinler ve Yalnızca Dizin Taramaları
- Dizinler Ne Zaman Zararlıdır: Yazmalar ve Seçicilik