0Pricing
Coding Interview Prep · Ders

Kapsayıcı Dizinler ve Yalnızca Dizin Taramaları

Bir sorgunun tablo yığınına hiç dokunmaması için sütunların dizine eklenmesi.

Kapsayıcı Dizinler ve Yalnızca Dizin Taramaları, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 3. 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.

Yığın Getirmesini Hatırlama

Daha önce normal bir B-ağacının yalnızca indekslenen sütunları ve bir satır işaretçisini sakladığını öğrenmiştiniz; bu nedenle indeks eşleşmeleri bulduktan sonra motorun diğer sütunları okumak için yine tabloya gitmesi gerekir. Bu geçiş yığın getirmesidir ve kapsayıcı indeksin ortadan kaldırmak üzere tasarlandığı maliyet budur.

Mülakat yapanlar, bir indeksin tabloya dokunmadan bir sorguyu neden tamamen yanıtlayabildiğini anlayıp anlamadığınızı görmek için kapsayıcı indeksleri sorar.

“Kapsayıcı” Ne Anlama Gelir

Sorgunun ihtiyaç duyduğu her sütun ( SELECT, WHERE, ORDER BY ve GROUP BY içinde kullanılanlar) indeksin kendisinde bulunduğunda indeks sorguyu kapsar.

Bu koşul sağlandığında motor yalnızca indeksi okur ve tabloya hiç gitmez. PostgreSQL buna Yalnızca İndeks Taraması adını verir; SQL Server ve diğer sistemler ise kapsayıcı indeks der. Bunun sonucu daha az sayfa okuma ve daha hızlı sorgulardır.

Uygulamalı Örnek: Kapsanan Bir Sorgu

Bir sorgunun yalnızca customer_id ve order_date sütunlarına ihtiyaç duyduğunu varsayalım. Tam olarak bu sütunlar üzerinde oluşturulmuş bileşik indeks, sorgunun istediği her şeyi içerir; dolayısıyla sorgu yalnızca indeksten yanıtlanabilir.

CREATE INDEX idx_orders_cust_date
  ON orders (customer_id, order_date);

-- Covered: both selected columns are in the index
SELECT customer_id, order_date
FROM orders
WHERE customer_id = 42;

Bir Ek Sütun Kapsamı Bozar

İndeksin içermediği bir sütun eklediğinizde kapsama kaybolur ve motorun bu sütunu almak için yığını getirmesi gerekir.

Burada total indekste bulunmadığından, aramayı customer_id yönetse bile eşleşen her satırda total değerini okumak için bir yığın getirmesi gerçekleşir.

-- NOT covered: total is not in the index, forces heap fetches
SELECT customer_id, order_date, total
FROM orders
WHERE customer_id = 42;

INCLUDE Yan Tümcesi

total sütununu dördüncü bir anahtar sütunu olarak ekleyebilirsiniz; ancak bu sütun üzerinde hiç filtreleme veya sıralama yapmıyorsanız, ağacın sıralama düzeninde yer kaplaması gereksizdir. Daha temiz çözüm, PostgreSQL ve SQL Server tarafından desteklenen INCLUDE seçeneğidir: ek sütunları indeksin yalnızca yapraklarında, sıralama anahtarının parçası olmayan yük verisi olarak saklar.

Böylece indeksin aranabilir kısmını gereksiz yere büyütmeden sorgu kapsanır.

CREATE INDEX idx_orders_cust_date_inc
  ON orders (customer_id, order_date)
  INCLUDE (total);

-- Now covered: total is carried in the leaf
SELECT customer_id, order_date, total
FROM orders
WHERE customer_id = 42;

Anahtar Sütunları ve Dahil Edilen Sütunlar

Mülakat yapanları etkileyecek kesin bir ayrım:

  • Anahtar sütunları sıralama düzenini belirler ve arama ile aralık taramasında kullanılabilir. En soldaki önek kuralına uyarlar.
  • Dahil edilen sütunlar yalnızca yapraklarda ek veri olarak saklanır; aranamazlar, ancak indeksin daha fazla sorguyu kapsamasını sağlarlar.

Pratik kural: üzerinde filtreleme yaptığınız veya sıraladığınız sütunları anahtara, yalnızca döndürdüğünüz sütunları INCLUDE içine koyun.

MySQL/InnoDB: Kümelenmiş Yapının Farkı

Farklı SQL lehçelerine hâkimiyetinizi gösterin. InnoDB (MySQL) tabloları birincil anahtara göre kümelenir: ikincil indeksler birincil anahtar sütunlarını örtük olarak taşır. Bu nedenle ikincil bir indeks, yalnızca indekslenen sütunlarla birincil anahtar sütunlarını seçen her sorguyu otomatik olarak kapsar; INCLUDE yan tümcesine gerek yoktur (MySQL'de INCLUDE bulunmaz).

Kapsayıcı indeks kavramı evrenseldir; söz dizimi ve ek maliyet olmadan gelen sütunlar motora göre değişir.

Yalnızca İndeks Taramasını Doğrulama

Kapsamı EXPLAIN ile kanıtlayın. PostgreSQL'de plan düğümünde Yalnızca İndeks Taraması yerine Index Scan görünür. EXPLAIN (ANALYZE) çıktısında Heap Fetches: 0 değerini arayın; bu, tabloya erişilmediğinin kesin işaretidir.

Yalnızca indeks taraması beklediğiniz hâlde yığın getirmeleriyle birlikte Index Scan görüyorsanız, seçilen bir sütun indekste eksiktir.

EXPLAIN (ANALYZE)
SELECT customer_id, order_date, total
FROM orders
WHERE customer_id = 42;
-- Look for: Index Only Scan ... Heap Fetches: 0

PostgreSQL Görünürlük Haritası Uyarısı

Ek puan getirecek incelikli bir PostgreSQL noktası: görünürlük haritasında bir sayfa tümüyle görünür olarak işaretlenmemişse Yalnızca İndeks Taraması yine de yığına dokunabilir. Yoğun güncellemelerden sonra görünürlük haritasının güncel olması için VACUUM çalıştırın; aksi takdirde Heap Fetches artar ve “yalnızca indeks” avantajı azalır.

-- Keeps the visibility map fresh so index-only scans stay heap-free
VACUUM ANALYZE orders;

Geniş Bir Kapsayıcı İndeks Oluşturmamanız Gereken Durumlar (NOT)

Kapsayıcı indeksler ücretsiz değildir. INCLUDE içine çok sayıda sütun eklemek indeksi büyütür, önbellekte daha fazla yer tüketir ve yazma işlemlerini yavaşlatır; çünkü ilgili her yazma işlemi indeksi de günceller. Belirtmeniz gereken ödünleşimler:

  • Yoğun kullanılan, dar kapsamlı ve sık çalıştırılan okuma sorguları için harikadır.
  • Her sütunu “ne olur ne olmaz” diye doldurmak için uygun değildir.

İhtiyaç duyulan sorguyu kapsayın, satırın tamamını değil.

Mülakatta Nasıl İfade Edilir

Özlü bir özet:

“Kapsayıcı indeks, sorgunun dokunduğu her sütunu içerir; böylece motor sorguyu yalnızca indeksten, yani Yalnızca İndeks Taraması ile yanıtlar ve yığın getirmesini atlar. Aranan sütunları anahtara, yalnızca döndürülen sütunları INCLUDE içine koyarım; EXPLAIN ANALYZE ile Heap Fetches değerinin sıfır olduğunu doğrular ve yazma hızını korumak için indeksi dar tutarım.”

Hızlı Kontrol

Kapsamı ve her sütun için uygun yeri değerlendirin.

Özet: Kapsayıcı İndeksler

Temel çıkarımlar:

  • Bir indeks, sorgunun ihtiyaç duyduğu her sütunu içerdiğinde sorguyu kapsar ve yığın getirmesi olmadan Yalnızca İndeks Taraması yapılmasını sağlar.
  • Anahtar sütunları aramaları yönlendirir ve en soldaki önek kuralına uyar; INCLUDE sütunları kapsamayı sağlayan, yalnızca yapraklarda bulunan yük verisidir.
  • InnoDB ikincil indeksleri birincil anahtarı örtük olarak içerir.
  • EXPLAIN (ANALYZE) ile doğrulama yapın ve Heap Fetches değerini izleyin; PostgreSQL'de VACUUM işlemini güncel tutun.
  • Yazma performansını korumak için kapsayıcı indeksleri dar tutun.

Sırada madalyonun diğer yüzü, indekslerin gerçekten ne zaman zarar verdiği var.

Sıkça Sorulan Sorular

“Kapsayıcı Dizinler ve Yalnızca Dizin Taramaları” dersi ücretsiz mi?

Evet — “Kapsayıcı Dizinler ve Yalnızca Dizin Taramaları” 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.

“Kapsayıcı Dizinler ve Yalnızca Dizin Taramaları” dersinde ne öğreneceğim?

Bir sorgunun tablo yığınına hiç dokunmaması için sütunların dizine eklenmesi. 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 3. dersidir.

“Kapsayıcı Dizinler ve Yalnızca Dizin Taramaları” 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

  1. B-Ağacı Dizinleri ve Faydaları
  2. Bileşik Dizin Sütunlarının Sırası
  3. Kapsayıcı Dizinler ve Yalnızca Dizin Taramaları
  4. Dizinler Ne Zaman Zararlıdır: Yazmalar ve Seçicilik
← Coding Interview Prep Sayfasına Dön