← Kursa Dön
📄 Text · 35 min

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 et

B-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ı destekler

  • Sıralama (ORDER BY) desteği

  • LIKE 'abc%' (prefix match) destekler

  • Logaritmik 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ıralama

Hash 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) desteklemez

  • Sıralama desteklemez

WHERE email = 'test@email.com'  -- ✅ Hash index hızlı
WHERE price > 100               -- ❌ Hash index kullanılamaz

Karşılaştırma

ÖzellikB-TreeHash
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ır

Secondary 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ı oku

Index 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)