Veritabanı İndeksleme Nedir ve Neden Sihirli Değil?

Veritabanı İndeksleme Nedir ve Neden Sihirli Değil?
audio-thumbnail
Veritabanı İndeksleme Nedir ve Neden Sihirli Değil?
0:00
/0

Veritabanı İndeksleme Nedir ve Neden Sihirli Değil?

Veritabanı performansını optimize etmek, özellikle büyük veri setleriyle çalışırken, kritik bir görevdir. Ancak çoğu geliştirici, veritabanı indekslerini bir "sihirli düğme" olarak görür. İndeksleri eklediğinde saniyeler içinde sorguların hızlandığını görünce, bunun bir büyülü etki olduğunu düşünür. Aslında bu durum sahiden sihirli değil. İndekslerin nasıl çalıştığını anlamak, performansı ötesinde verimlilik açısından çok daha anlamlı hale getirir. Bu yazıda, indekslerin temel mantığını, nasıl çalıştığını ve gerçek performans artışı nasıl sağlanır sorusunu cevaplayarak, sizi bu "sihirli" görünümün ötesine taşıyacağız.


İndeks Nedir? Gerçekten Sihirli mi?

Gelin, önce basit bir örnek ile başlayalım. Bir kitapta belirli bir konuyu bulmak istiyorsanız ne yaparsınız? Her sayfayı tek tek okuyarak mı arıyorsunuz? Elbette hayır. Kitabın içindeki İçindekiler sayfasını kullanırsınız. Bu sayfa, hangi konunun hangi sayfada olduğunu bize söyler. Böylece sadece ilgili bölümü açarak aramayı hızlandırırız.

Bu mantık, veritabanı indeksleri için de geçerlidir. Bir veritabanında milyonlarca kayıt varsa ve sadece bir tanesini bulmamız gerekiyorsa, tüm kayıtları tek tek tarayarak yapmak çok zaman alır. Burada indesk, “İçindekiler” gibi bir araç görevi görür. Ancak bu sistem, sadece sayfa numarasını değil, daha karmaşık bir yapıyla verilerin yerini gösterir.


İndeksleme Nasıl Çalışır? Gerçekten Hızlandırır mı?

Şimdi bir örnek üzerinden görelim. PostgreSQL kullanarak, Postgres Air adlı bir veri seti üzerinde çalışalım. Bu veri seti, uçuş rezervasyonlarına ait 16 milyon satırlık bir passenger (yolcu) tablosu içerir.

1. İndeks Yokken Sorgu Yapımı

İlk olarak, passenger tablosunda first_name = 'JASON' ve account_id = 101701 olan satırları sorgulayalım:

SELECT * FROM postgres_air.passenger WHERE first_name = 'JASON' AND account_id = 101701;

Bu sorgu, cihazım olan MacBook Air M1'de 5 saniye sürdü. Yani, veritabanı her satırı tek tek okuyor ve filtreleme yapıyor.

2. İndeks Eklendikten Sonra

Şimdi, bu sorgunun hızlanmasını sağlamak için bir indeks oluşturalım:

CREATE INDEX "passenger_name_account_id" ON "postgres_air"."passenger" ("first_name", "account_id");

Yine aynı sorguyu çalıştırdığımızda, cevap 1 milisaniye içinde geldi! (İlk çalıştırmada 6 ms, ardından işletim sistemi önbelleği etkisiyle 1 ms’ye düşmüş).

Bu, 5 saniyeden 1 milisaniyeye düşüş demektir. Yani 5000 kat daha hızlı.


Peki, Neden Bu Kadar Fark Var?

Bu fark, veritabanının sorguyu nasıl yorumladığını anlamakla açıklanır. Bu konuda en iyi araç, EXPLAIN komutudur. Bu komut, veritabanının sorguyu nasıl işlediğini adım adım gösterir.

İndeks Yokken: Seçili Arama (Sequential Scan)

İndeks olmadan, PostgreSQL sorguyu şu şekilde işler:

Gather (cost=1000.00..274633.68 rows=1 width=47)
  Workers Planned: 2
  -> Parallel Seq Scan on passenger (cost=0.00..273633.58 rows=1 width=47)
     Filter: ((first_name = 'JASON'::text) AND (account_id = 101701))

Burada, veritabanı tüm satırları sırayla okuyor (Sequential Scan). Her bir satırda first_name ve account_id değerlerini kontrol ediyor. Bu, büyük veri setlerinde çok zaman alır.

İndeks Varken: İndeks Araması (Index Scan)

İndeks oluşturduktan sonra, EXPLAIN çıktısı şu şekilde değişir:

Index Scan using passenger_name_account_id on passenger (cost=0.43..8.46 rows=1 width=47)
  Index Cond: ((first_name = 'JASON'::text) AND (account_id = 101701))

Şimdi veritabanı tüm satırları taramıyor. Bunun yerine, first_name ve account_id değerlerini önceden sıralanmış bir yapıda arar. Bu yapı, genellikle B-tree olarak adlandırılır. Veritabanı, bu ağacın yapısını kullanarak, sadece ilgili satırları hemen bulur.


İndeks Nedir? Gerçekten Bir Ağaç mı?

Evet, bir veritabanı indeksi genellikle B-tree (Balıkçı Ağaç) adı verilen bir veri yapısı üzerine kuruludur. B-tree, verileri sıralı ve ağaç benzeri bir yapıda tutar. Bu sayede:

  • Arama, logaritmik zaman karmaşıklığıyla yapılır (yani O(log n)).
  • Sorgular, doğrudan ilgili verilere gider, tüm veriyi tarar.
  • Ekstra bir depolama alanı gerekir, ancak bu, sorgu hızı için büyük bir yatırım.

Böylece, veritabanı, bir sayfayı aramak yerine, sayfaların adreslerini bir dizin gibi saklar. Bu sayede, doğru sayfaya hemen gider, tüm sayfaları okumak zorunda kalmaz.


İndeksler Sadece Hızlandırır mı?

Hayır. İndeksler sadece okuma hızını değil, aynı zamanda kaydetme ve güncelleme işlemlerini de etkiler. Çünkü her veri güncellendiğinde, indeks yapıları da güncellenmelidir. Bu nedenle:

  • İndeksler, yazma işlemi için ekstra maliyet oluşturur.
  • Büyük veri setlerinde, çok sayıda indeks eklenirse, veritabanının yazma performansı düşer.

Bu yüzden, indeksler sadece sorguları hızlandırmak için değil, doğru yerde, doğru anda kullanılmalıdır.


İndeksleme Stratejileri: Ne Zaman Kullanmalı?

İndeksler, sadece hız artışı için değil, veri bütünlüğü ve sorgu doğruluğu açısından da önemlidir. İşte doğru stratejiler:

1. Sık Sorgulanan Sütunlara İndeks Koyun

  • Eğer bir sütunu (örneğin first_name, account_id) sıklıkla WHERE şartında kullanıyorsanız, ona indeks koyun.
  • Ama sadece gerekli sütunlara indeks ekleyin. Fazla indeks, veritabanını yavaşlatır.

2. Birlikte Sorgulanıyorlar mı?

  • Eğer iki sütun (örneğin first_name ve account_id) sıklıkla birlikte sorgulanıyorsa, karma indeks (composite index) kullanın: sql CREATE INDEX "passenger_name_account_id" ON "passenger" ("first_name", "account_id");

3. İndeks Kullanımı ile Daha Fazla Veri Alın

  • İndeksler, yalnızca veri arama değil, aynı zamanda sıralama (ORDER BY) ve gruplama (GROUP BY) işlemlerinde de etkili olabilir.

4. İndeksleri Sürekli İzleyin

  • Sorgu performansını düzenli olarak kontrol edin.
  • EXPLAIN komutu ile sorgu planını inceleyin.
  • İndekslerin hâlâ gerekli olup olmadığını anlayın.

Sonuç: İndeksler Sihirli Değil, Bilgiyle Çalışır

İndeksler, veritabanı performansını dramatik bir şekilde artırabilir. Ancak bu, "sahne arka planındaki büyücünün döndürdüğü bir sihirli çubuk" değil. İndeksler, verilerin daha hızlı bulunabilmesi için kurulmuş bir yol haritasıdır.

Bunu anlayabilmek için sadece bir komut yazmak değil, veritabanının nasıl çalıştığını anlamak gerekir. İndeksler, veri yapıları, sorgu optimizasyonu ve veri depolama modelleri gibi temel kavramlara hakim olmak, sadece "kod yazmak" değil, veri ile düşünmek anlamına gelir.

Yani:

İndeksler sihirli değil, bilgiyle çalışır.


Ekstra Düşünce

Her sorgu için indeks eklemek, her durumda doğru değildir. Bazı sorgular, çok az veri içerir ve indeks bile gerekmez. Bu yüzden, veritabanı performansını optimize etmek, sadece "daha hızlı sorgu" değil, doğru strateji ve anlama ile olur.

İndeksler, birer araçtır. Ve her araç, doğru zamanda, doğru yerde kullanılmalıdır.