B-Ağacı Dizinleri ve Faydaları
Bir dizinin gerçekte ne sakladığı ve hangi işlemleri hızlandırdığı.
B-Ağacı Dizinleri ve Faydaları, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 1. 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.
Görüşmeciler Dizinler Hakkında Neden Soru Sorar
Bir görüşmeci “Bu sorgu yavaş, ne yaparsınız?” dediğinde, duymayı beklediği yanıt neredeyse her zaman bir dizin içerir. Dizinler, okuma performansını artıran en güçlü araçtır; bu nedenle yalnızca söz dizimini ezberleyen adaylarla veritabanının satırları gerçekte nasıl bulduğunu anlayan adayları birbirinden ayırırlar.
Bu derste B-Ağacı dizini hakkında kesin bir zihinsel model oluşturacaksınız: ne sakladığını, hangi işlemleri hızlandırdığını ve bu konudan kıdemli bir mühendis gibi nasıl söz edeceğinizi öğreneceksiniz.
Bir Dizinin Çözdüğü Sorun
Bir dizin olmadan, bir koşulla eşleşen satırları bulmak veritabanını tablodaki her satırı okumaya zorlar. Buna ardışık tarama (veya tam tablo taraması) denir. Milyon satırlı bir tabloda, yalnızca bir satır eşleşse bile bu, bir milyon satırın kontrol edilmesi anlamına gelir.
Dizin, motorun eşleşen satırlara doğrudan gitmesini sağlayan ayrı ve sıralı bir veri yapısıdır; tıpkı bir kitap dizininin her sayfayı okumadan bir konuyu bulmanızı sağlaması gibi.
-- No index: the engine reads ALL rows to find this one
SELECT * FROM users WHERE email = 'ada@example.com';Bir B-Ağacı Gerçekte Ne Saklar
PostgreSQL, MySQL, SQL Server ve çoğu veritabanı motorundaki varsayılan dizin B-Ağacıdır (dengeli ağaç). Dizinlenen sütun değerlerini sıralı düzende saklar ve bunları sığ bir sayfa ağacı içinde düzenler.
- Her yaprak düğüm, dizin anahtarlarını ve gerçek tablo satırına işaret eden bir işaretçiyi içerir.
- Ağaç dengeli kaldığından, tablonun boyutundan bağımsız olarak her arama yalnızca birkaç sayfaya dokunur.
Bir arama, tüm N satırı taramak yerine kökten yaprağa yaklaşık log(N) adımda ilerler.
İlk Dizininizi Oluşturma
Bir B-Ağacı dizinini CREATE INDEX ile oluşturursunuz. İnceleyen kişinin tabloyu ve sütunları bir bakışta anlayabilmesi için dizini açıkça adlandırın.
Bu dizin oluşturulduktan sonra, email üzerinde filtreleme yapan bir sorgu, tam tarama yerine eşleşen satırı birkaç sayfa okumasıyla bulmak için bu dizini kullanabilir.
CREATE INDEX idx_users_email ON users (email);
-- Now this lookup uses the index instead of scanning
SELECT * FROM users WHERE email = 'ada@example.com';Bir B-Ağacının Hızlandırdığı İşlemler
B-Ağacı değerleri sıralı tuttuğu için yalnızca tam eşleşmeleri hızlandırmaz. Görüşmeciler, aşağıdakileri kesin biçimde sıralamanızı takdir eder:
- Eşitlik:
WHERE email = ? - Aralık:
WHERE age > 30,BETWEEN,<,>= - Önek eşleşmesi:
WHERE name LIKE 'Ada%'(ancak'%da'değil) - Dizinlenen sütunda ORDER BY kullanılması; böylece sıralama adımı atlanır
- Sıralı yapının uçlarında bulundukları için MIN/MAX
Uygulamalı Örnek: Aralık Sorgusu
Milyonlarca satır içeren bir siparişler tablosu düşünün. Bir raporlama sorgusu yakın tarihli siparişleri istiyor. created_at üzerinde bir dizin olduğunda motor, sıralı dizinde aralığın başlangıcına gider ve yalnızca gerektiği kadar ilerler.
Dizin, tam tablo taramasını sınırlı aralık taramasına dönüştürür ve yalnızca koşulu sağlayan bölümü okur.
CREATE INDEX idx_orders_created_at ON orders (created_at);
SELECT order_id, total
FROM orders
WHERE created_at >= '2026-01-01'
AND created_at < '2026-02-01';Dizinler Sıralamaya da Yardımcı Olur
Sıklıkla gözden kaçırılan bir nokta şudur: Dizin zaten sıralı olduğundan motor, satırları dizin sırasına göre döndürebilir ve ayrı bir sıralama adımını atlayabilir. Bu, ORDER BY ve özellikle ilk N sonuç için sayfalama açısından önemlidir.
Eşleşen bir dizine sahip sütuna göre sıralama yaptığınızda, iyileştirici dizini sırayla okuyabilir ve yeterli satıra ulaştığında erkenden durabilir.
-- Index on created_at lets this avoid a sort and stop after 10 rows
SELECT order_id, total
FROM orders
ORDER BY created_at DESC
LIMIT 10;Gizli Maliyet: Yığın Getirmesi
Normal bir B-Ağacı dizini yalnızca dizinlenen sütunu ve bir satır işaretçisini saklar. Bu nedenle eşleşen girdileri bulduktan sonra motor, seçtiğiniz diğer sütunları okumak için yine tabloya (yığına) gitmelidir.
Bu ikinci sıçrama yığın getirmesi olarak adlandırılır. Birkaç satır için ucuzdur, ancak bir sorgu çok sayıda satırla eşleştiğinde pahalı hâle gelir; düşük seçiciliğe sahip bir dizinin bazen yok sayılmasının nedenlerinden biri budur. (Kapsayan dizinlerin bunu daha sonra nasıl çözdüğünü göreceksiniz.)
Dizinin Kullanıldığını Doğrulama
Bir dizinin kullanıldığını asla varsaymayın; bunu EXPLAIN ile kanıtlayın. Görüşmede planı anlatarak ilerlemeniz, konuyu gerçekten anladığınızı gösterir.
Seq Scan, dizinin kullanılmadığı anlamına gelir.Index ScanveyaIndex Seek, dizinin kullanıldığı anlamına gelir.
Bir dizin eklediğiniz hâlde hâlâ ardışık tarama görüyorsanız planlayıcı taramayı daha ucuz bulmuştur; bunun yaygın nedeni, sorgunun tablonun çok büyük bir bölümüyle eşleşmesidir.
EXPLAIN
SELECT * FROM users WHERE email = 'ada@example.com';
-- Look for: Index Scan using idx_users_emailBirincil Anahtarlar Zaten Dizinlenmiştir
Görüşmelerde sık karşılaşılan bir tuzak şudur: bir PRIMARY KEY veya UNIQUE kısıtlaması tanımlamak, destekleyici bir B-Ağacı dizinini otomatik olarak oluşturur. Aynı sütun üzerinde ikinci bir dizin eklemezsiniz ve eklememelisiniz.
Bu nedenle birincil anahtarlar üzerindeki birleştirmeler ve aramalar zaten hızlıdır. “id sütununu dizinlemeli miyim?” sorusu da genellikle bir tuzaktır; bu işlem sizin için zaten yapılmıştır.
-- This already builds a unique B-Tree index on (id)
CREATE TABLE users (
id BIGINT PRIMARY KEY,
email TEXT UNIQUE
);Görüşmede Nasıl İfade Edilir
Konuyu, görüşmecinin kolayca onaylayabileceği düzgün bir tek cümleyle bağlayın:
“B-Ağacı dizini, sıralı ve dengeli bir yapıdır; motorun tüm tabloyu taramak yerine log(N) sayfa okumasıyla satırları bulmasını sağlar. Dizinlenen sütunlardaki eşitlik, aralık, önek ve ORDER BY işlemlerini hızlandırır; ancak her eşleşme, dizinde olmayan sütunlar için yine bir yığın getirmesi gerektirir.”
Ardından bunu EXPLAIN ile destekleyin. Modeli kanıtla birleştirmek puan kazandırır.
Hızlı Kontrol
Bir B-Ağacı dizininin neleri hızlandırdığına ilişkin zihinsel modelinizi sınayın.
Özet: B-Ağaçları
Sonraki derse taşımanız gereken temel çıkarımlar:
- Bir B-Ağacı, dizinlenen değerleri dengeli bir ağaçta sıralı biçimde saklar ve
log(N)aramaları sağlar. - Eşitlik, aralık, önek (baştaki) LIKE, ORDER BY ve MIN/MAX işlemlerini hızlandırır.
- Dizinde bulunmayan sütunlar için her eşleşmede yine bir yığın getirmesi gerekir.
- Bir sütunu bir işleve sarmalamak veya başta joker karakter kullanmak dizini devre dışı bırakır.
- Her zaman
EXPLAINile doğrulayın; PRIMARY KEY ve UNIQUE kısıtlamaları otomatik olarak dizin oluşturur.
Sırada: Bir dizin aynı anda birkaç sütunu kapsadığında sütunların nasıl sıralanacağı.
Sıkça Sorulan Sorular
“B-Ağacı Dizinleri ve Faydaları” dersi ücretsiz mi?
Evet — “B-Ağacı Dizinleri ve Faydaları” 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.
“B-Ağacı Dizinleri ve Faydaları” dersinde ne öğreneceğim?
Bir dizinin gerçekte ne sakladığı ve hangi işlemleri hızlandırdığı. 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 1. dersidir.
“B-Ağacı Dizinleri ve Faydaları” 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