IHS Strategic
Tüm Blog Yazıları
HowTo10 Eylül 2026•2 dk okuma

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

Yavaş SQL sorgularını tespit etme, doğru indeks yapılandırmaları ve modern web mimarilerinde veritabanı yanıt sürelerini milisaniyelere düşürme adımları.

S

Sistem Yöneticisi

Kıdemli Yazılım Mimarı

1. Adım: Darboğaz Tespiti ve Profiling

Veritabanı optimizasyonunda ilk adım körü körüne indeks eklemek değil, yavaş çalışan sorguları izlemektir. Modern web uygulamalarında milisaniyelik gecikmeler kullanıcı deneyimini doğrudan bozar.

Slow Query Log ve EXPLAIN ANALYZE

Veritabanı motorunda slow query log mekanizmasını aktif edin. Eşik değerini aşan sorguları EXPLAIN ANALYZE ile inceleyin:

EXPLAIN ANALYZE
SELECT users.id, orders.total
FROM users
JOIN orders ON users.id = orders.user_id
WHERE orders.created_at >= '2025-01-01'
ORDER BY orders.total DESC
LIMIT 20;

Çıktıda şu metriklere bakın:

  • Seq Scan / Full Table Scan: Tablo baştan sona taranıyor. İndeks eksik.
  • Rows Removed by Filter: Filtreleme diskten okuma sonrasında yapılıyor. Maliyetli.
  • Actual Time: İlgili operasyonun harcadığı gerçek süre.

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

Her kolon indekslenmez. Fazla indeks yazma (INSERT/UPDATE/DELETE) operasyonlarını yavaşlatır.

B-Tree İndeksler (Varsayılan)

Eşitlik (=) ve aralık (<, >, BETWEEN) sorguları için standart çözümdür.

CREATE INDEX idx_orders_created_at ON orders(created_at);

Bileşik (Composite) İndeksler ve Sütun Sıralaması

Birden fazla sütun içeren filtrelerde sütun sırası kritiktir. Kural: Eşitlik filtreleri başa, aralık filtreleri sona.

-- WHERE tenant_id = 5 AND status = 'active' AND created_at > '2025-01-01'
CREATE INDEX idx_tenant_status_date ON orders(tenant_id, status, created_at);

Covering İndeks (INCLUDE)

Tabloya gitmeden veriyi doğrudan indeksten döndürmek (Index-Only Scan) I/O yükünü sıfıra indirir:

CREATE INDEX idx_users_active_include ON users(email) INCLUDE (id, created_at) WHERE is_active = true;

3. Adım: Sorgu Anti-Pattern'lerini Düzeltme

Fonksiyon İçi Kolon Kullanımı

İndeksli sütunu fonksiyon içine alırsanız indeks devre dışı kalır:

  • Yanlış: WHERE DATE(created_at) = '2025-01-01'
  • Doğru: WHERE created_at >= '2025-01-01 00:00:00' AND created_at < '2025-01-02 00:00:00'

Wildcard ile Başlayan LIKE Sorguları

LIKE '%keyword' aramaları B-Tree indeks kullanamaz. Tam metin araması için GIN/GiST indeks veya Full-Text Search mimarisine geçin.

SELECT * Felaketi ve N+1 Problemi

Gereksiz sütun çekmek bellek ve bant genişliği tüketir. Sadece gereken sütunları seçin. ORM katmanında ilişkili tabloları döngü içinde tek tek çekmek (N+1) yerine JOIN veya Eager Loading uygulayın.

Not: Bir dijital ajans veya modern web geliştirme ekibi için veritabanı optimizasyonu, sunucu maliyetlerini düşürmenin ve Core Web Vitals metriklerini iyileştirmenin en ucuz yoludur.

4. Adım: Bakım ve Trendler

Modern veritabanı motorları periyodik bakım gerektirir. Veri değiştikçe istatistikler eskir, sorgu planlayıcı yanlış kararlar verir.

  • ANALYZE / VACUUM: PostgreSQL tarafında tablo istatistiklerini güncelleyin, ölü satırları temizleyin.
  • Kullanılmayan İndeksleri Silme: pg_stat_user_indexes üzerinden sıfır okuma alan indeksleri tespit edip silin.
  • Connection Pooling: PgBouncer benzeri araçlarla bağlantı maliyetini kısın.