IHS Strategic
Tüm Blog Yazıları
HowTo16 Eylül 2026•4 dk okuma

Veritabanı İndeksleme ve Sorgu Optimizasyonu Rehberi: Yanıt Sürelerini Düşürme Adımları

Veritabanı yanıt sürelerini milisaniyelere indirmek için indeksleme stratejilerini, sorgu analiz tekniklerini ve modern veri mimarisi yaklaşımlarını adım adım keşfedin.

S

Sistem Yöneticisi

Kıdemli Yazılım Mimarı

Kullanıcı deneyiminin ve sistem ölçeklenebilirliğinin temel taşlarından biri, düşük yanıt süreleridir. Yavaş yüklenen sayfalar ya da takılan mobil uygulamalar, çoğu zaman optimize edilmemiş veritabanı sorgularının ve eksik indeksleme mimarisinin bir sonucudur. Modern bir dijital strateji kapsamında, altyapı maliyetlerini düşürürken kullanıcı memnuniyetini en üst düzeye çıkarmak için veritabanı performansını sürekli optimize etmek zorunluluk haline gelmiştir.

Bu rehber içeriğimizde; yavaş sorguları tespit etme, doğru indeks yapılarını seçme ve sorgu yazım tekniklerini iyileştirme adımlarını pratik örneklerle ele alıyoruz.

Adım 1: Yavaş Çalışan Sorguları Tespit Etme ve Profil Çıkarma

Optimizasyon sürecinin ilk kuralı, körü körüne indeks eklemek yerine darboğazları kesin verilerle teşhis etmektir.

  • Slow Query Log Aktifleştirme: MySQL, PostgreSQL veya SQL Server üzerinde belirli bir süreyi (örneğin 200ms üzeri) aşan sorguların loglanmasını sağlayın. PostgreSQL için pg_stat_statements, MySQL için slow_query_log parametrelerini devreye alın.
  • EXPLAIN ve EXPLAIN ANALYZE Kullanımı: Bir sorgunun arkasında yatan yürütme planını (Execution Plan) okumak en kritik beceridir. Sorgunuzun başına EXPLAIN ANALYZE ekleyerek veritabanının tabloyu baştan sona mı taradığını (Seq Scan / Full Table Scan) yoksa indeksi mi kullandığını (Index Scan / Index Seek) analiz edin.
İpucu: Eğer yürütme planında 'Cost' (maliyet) ve filtrelenen satır sayısı gerçek satır sayısına göre çok yüksekse, o sorgu mutlaka optimizasyona ihtiyaç duyuyor demektir.

Adım 2: Doğru İndeks Türünü Seçme ve Uygulama

İndeksler, kitapların sonundaki 'dizin' sayfalarına benzer; tablodaki tüm veriyi taramadan doğrudan aranan satıra ulaşılmasını sağlar. Ancak her senaryo için tek bir indeks tipi geçerli değildir.

B-Tree İndeksleri

İlişkisel veritabanlarında varsayılan ve en yaygın kullanılan indeks tipidir. Eşitlik (=), aralık sorguları (>, <, BETWEEN) ve sıralama (ORDER BY) işlemlerinde mükemmel performans gösterir.

Composite (Bileşik) İndeksler

Birden fazla sütunun birlikte filtrelendiği sorgular için hayati önem taşır. Burada Leftmost Prefix (En Sol Öncelik) kuralı geçerlidir: İndeks (status, created_at) şeklinde tanımlandıysa, sorgunuz yalnızca status veya hem status hem created_at kullandığında çalışır; yalnızca created_at üzerinden filtreleme yapıldığında bu indeks kullanılamaz.

Kısmi (Partial) İndeksler

Tablodaki tüm satırlar yerine yalnızca belirli bir koşulu sağlayan satırları indeksleyerek disk alanı ve yazma maliyetinden tasarruf edin. Örneğin, sadece aktif kullanıcıları listeliyorsanız: CREATE INDEX idx_active_users ON users(id) WHERE is_active = true;.

Adım 3: Sorgu Tasarımını ve Kodlamasını İyileştirme

Bazen indeks eklemek yerine sorgunun yazılış biçimini değiştirmek yanıt süresini 10 kat hızlandırabilir.

  • SELECT * Kullanımını Terk Edin: Yalnızca ihtiyacınız olan sütunları çağırın. Bu, ağ trafiğini azaltır ve veritabanının Covering Index (yalnızca indeksten veriyi okuyup tabloya gitmeme) avantajını kullanmasını sağlar.
  • İndeksleri Bozan Fonksiyonlardan Kaçının: WHERE YEAR(created_at) = 2024 şeklinde yazılan filtreler indeksin devre dışı kalmasına neden olur. Bunun yerine WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01' yapısını tercih edin.
  • Sayfalama (Pagination) Yaklaşımını Değiştirin: Milyonlarca satırlık tablolarda OFFSET 1000000 LIMIT 20 sorgusu ciddi gecikmelere yol açar. Bunun yerine ID veya tarih bazlı Keyset Pagination (Cursor-based) tekniğine geçiş yapın: WHERE id > last_seen_id ORDER BY id ASC LIMIT 20.
  • N+1 Sorgu Problemini Engelleyin: Özellikle ORM (Hibernate, Entity Framework, Prisma vb.) kullanımında döngü içinde tek tek sorgu atmak yerine JOIN veya IN operatörleriyle toplu veri çekin.

Adım 4: Aşırı İndeksleme (Over-Indexing) Maliyetlerini Yönetme

İndeksler okuma (READ) operasyonlarını hızlandırırken, yazma (INSERT, UPDATE, DELETE) işlemlerini yavaşlatır; çünkü her yeni veri eklendiğinde indeks ağacının da güncellenmesi gerekir.

  • Kullanılmayan veya yinelenen (redundant) indeksleri periyodik olarak tespit edip silin.
  • Çok sık güncellenen ve nadir sorgulanan sütunlara indeks koymaktan kaçının.
  • Veritabanı istatistiklerini (ANALYZE / VACUUM) düzenli aralıklarla güncel tutarak optimize edicinin doğru kararlar vermesini sağlayın.

Adım 5: Modern Veri Mimarisi ve Geleceğin Trendleri

Veritabanı dünyasındaki son trendler, sorgu optimizasyonunun sadece tekil SQL komutlarıyla sınırlı olmadığını, mimari yaklaşımlarla desteklenmesi gerektiğini gösteriyor.

  • In-Memory Caching (Redis / Memcached): Sık okunan fakat nadir değişen sorgu sonuçlarını önbelleğe alarak ana veritabanı yükünü %80'e kadar azaltın.
  • Read/Write Replicas (CQRS Temeli): Yoğun okuma trafiğini 'Read Replica' sunuculara yönlendirerek ana veritabanını sadece yazma işlemlerine ayırın.
  • Connection Pooling: Veritabanı bağlantı havuzlarını (PgBouncer, HikariCP) doğru yapılandırarak anlık yüksek trafiklerde connection gecikmelerini önleyin.

Sonuç ve Eylem Planı

Veritabanı optimizasyonu tek seferlik bir görev değil, projenin yaşam döngüsü boyunca sürdürülmesi gereken bir süreçtir. Yavaş sorguları izleme altına alarak, yürütme planlarını düzenli kontrol ederek ve gereksiz indekslerden arınarak yanıt sürelerinizi saniyelerden milisaniyelere çekebilirsiniz.