Index Nedir? B-Tree vs Hash Index
Giriş — Neden Sorgular Yavaşlar?
Bir kitapta "normalizasyon" kelimesini arıyorsun. İki yol var: ya kitabı sayfa sayfa oku (full table scan), ya da kitabın sonundaki indekse bak ve doğrudan o sayfaya git. Veritabanı index'leri de tam olarak bunu yapar.
🎯 Analoji: Index = kitabın sonundaki dizin. "Normalizasyon ... sayfa 147" yazıyor, doğrudan 147'ye gidiyorsun. Index olmadan veritabanı her satırı tek tek kontrol eder (sequential scan) — milyonlarca satırda bu felaket.
Index Nasıl Çalışır?
Index, bir sütundaki (veya sütunlardaki) değerleri sıralı bir veri yapısında tutar ve her değerin tablodaki fiziksel konumuna (pointer) işaret eder.
Index (city sütunu):
Ankara → satır 2, 8
Antalya → satır 6
Bursa → satır 5
İstanbul → satır 1, 4, 7, 10
İzmir → satır 3, 9
-- WHERE city = 'İstanbul' → index'e bak → satır 1, 4, 7, 10 → doğrudan oku
-- Index olmadan → 10 satırın hepsini kontrol etB-Tree Index (Varsayılan)
MySQL InnoDB'nin varsayılan index yapısıdır. B-Tree (Balanced Tree) dengeli bir ağaç yapısıdır:
[M]
/ \
[D, H] [S, W]
/ | \ / | \
[A-C][E-G][I-L][N-R][T-V][X-Z]Özellikleri:
Eşitlik (
=) ve aralık (>,<,BETWEEN) sorgularını desteklerSıralama (
ORDER BY) desteğiLIKE 'abc%'(prefix match) desteklerLogaritmik arama süresi: O(log n)
Desteklenen sorgular:
WHERE price = 100 -- ✅ Eşitlik
WHERE price > 100 -- ✅ Aralık
WHERE price BETWEEN 50 AND 200 -- ✅ Aralık
WHERE name LIKE 'Mac%' -- ✅ Prefix match
ORDER BY price -- ✅ SıralamaHash Index
Sadece eşitlik aramalarında kullanılır. MySQL'de MEMORY engine'de varsayılan, InnoDB'de doğrudan desteklenmez (adaptive hash index otomatik çalışır).
Özellikleri:
Eşitlik (
=,IN) çok hızlı: O(1)Aralık (
>,<,BETWEEN) desteklemezSıralama desteklemez
WHERE email = 'test@email.com' -- ✅ Hash index hızlı
WHERE price > 100 -- ❌ Hash index kullanılamazKarşılaştırma
| Özellik | B-Tree | Hash |
|---|---|---|
| Eşitlik (=) | ✅ | ✅ (daha hızlı) |
| Aralık (>, <, BETWEEN) | ✅ | ❌ |
| Sıralama (ORDER BY) | ✅ | ❌ |
| Prefix match (LIKE 'abc%') | ✅ | ❌ |
| InnoDB desteği | ✅ Varsayılan | ❌ Otomatik (adaptive) |
Primary Key Index (Clustered Index)
InnoDB'de PRIMARY KEY clustered index'tir — veri fiziksel olarak PK sırasında saklanır:
-- PK = clustered index
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT, -- Clustered index
product_name VARCHAR(200)
);
-- Tablo verileri product_id sırasında diskte saklanırSecondary index (ek indexler) PK değerine referans verir:
Secondary index (category_id):
category_id = 1 → product_id 5, 6, 11, 13
category_id = 2 → product_id 1, 4, 12
-- Önce secondary index'te bul, sonra PK ile satırı okuIndex Olmadan vs Index İle — Performans Farkı
-- 1 milyon satırlık tabloda:
-- Index YOK: WHERE email = 'test@email.com'
-- → Full table scan: 1.000.000 satır okunur → ~2 saniye
-- Index VAR: email sütununda index
-- → Index lookup: ~3-4 sayfa okunur → ~0.001 saniye
-- Fark: ~2000 kat!Özet
Index, sorgu performansını dramatik şekilde artırır (1000x+)
B-Tree: varsayılan, eşitlik + aralık + sıralama destekler
Hash: sadece eşitlik, InnoDB'de otomatik (adaptive)
Clustered index = PRIMARY KEY (InnoDB'de veri bu sırada saklanır)
Secondary index = ek indexler (PK referansı tutar)
Index okumayı hızlandırır ama yazma maliyeti ekler (INSERT/UPDATE yavaşlar)
AI Asistan
Sorularını yanıtlamaya hazır