Sql & Veritabanı İle Uygulamalar İçin Veri İndeksleme Stratejisi Nasıl Yapılır?

Sql & Veritabanı İle Uygulamalar İçin Veri İndeksleme Stratejisi Nasıl Yapılır?
Sql & Veritabanı İle Uygulamalar İçin Veri İndeksleme Stratejisi Nasıl Yapılır?

Ön Hazırlık ve Gereksinimler

Uygulamalarınızda indeksleme stratejisi geliştirmek için öncelikle standart bir SQL veritabanı yönetim sistemine (PostgreSQL, MySQL veya SQL Server) ve temel SQL bilgisine sahip olmanız gerekir. 2026 yılı itibarıyla PostgreSQL 17+ veya MySQL 9+ sürümleri, gelişmiş sorgu planlayıcıları ile indeksleme süreçlerini daha verimli yönetmektedir.

  • Veritabanı İstemcisi: DBeaver veya pgAdmin gibi bir araçla sorgu planlarını (EXPLAIN ANALYZE) inceleyebilmelisiniz.
  • Örnek Veri Seti: İndekslemenin etkisini görmek için en az 100.000 satırlık test tabloları oluşturun.
  • Sorgu Analiz Yeteneği: Yavaş çalışan sorguları tespit etmek için 'Slow Query Log' mekanizmasını yapılandırın.

Adım 1: İndeksleme İhtiyacını Analiz Etme

Her sütuna indeks eklemek, veritabanını hızlandırmaz; aksine performansı düşürür. İndeksleme yapmadan önce, sorgularınızın nasıl çalıştığını anlamanız gerekir. SQL'de EXPLAIN komutu, veritabanının veriye ulaşmak için hangi yolu (Full Table Scan veya Index Scan) seçtiğini gösterir.

-- Sorgu planını analiz etme
EXPLAIN ANALYZE
SELECT * FROM siparisler 
WHERE musteri_id = 1542;

Yukarıdaki komutu çalıştırdığınızda, "Seq Scan" (Sıralı Tarama) ifadesini görüyorsanız, veritabanı tüm tabloyu okuyor demektir. Bu, indeksleme ihtiyacının en büyük göstergesidir.

Adım 2: Tek Sütunlu İndeks (Single-Column Index) Oluşturma

En temel indeksleme yöntemi, sıkça arama kriteri olarak kullanılan (WHERE, JOIN, ORDER BY) sütunlara indeks eklemektir. Örneğin, bir e-ticaret uygulamasında kullanıcıların e-posta adresleri üzerinden giriş yapması çok sık gerçekleşen bir işlemdir.

-- E-posta sütununa B-Tree indeksi ekleme
CREATE INDEX idx_kullanici_email ON kullanicilar(email);

Bu işlem, e-posta sütunu için bir B-Tree (Balanced Tree) yapısı oluşturur. B-Tree, verileri sıralı tutarak arama süresini O(log n) karmaşıklığına indirir. Sonuç olarak, veritabanı milyonlarca satır arasından aradığınız e-postayı milisaniyeler içinde bulur.

Adım 3: Bileşik İndeks (Composite Index) Stratejisi

Çoğu zaman sorgularınızda birden fazla sütunu aynı anda kullanırsınız. Örneğin, "belirli bir tarihteki ve belirli bir durumdaki siparişleri getir" gibi bir sorgu için bileşik indeksler hayat kurtarıcıdır.

-- Birden fazla sütun için bileşik indeks
CREATE INDEX idx_siparis_tarih_durum ON siparisler(siparis_tarihi, durum);

Dikkat: Bileşik indekslerde sütun sırası kritiktir. Sorgunuzda en çok filtrelenen veya en yüksek seçiciliğe (cardinality) sahip olan sütunu başa yazmalısınız. Eğer sorgunuzda sadece durum sütununu kullanıyorsanız, bu indeks her zaman verimli çalışmayabilir.

Adım 4: İndeksleme Yöntemleri Karşılaştırma Tablosu

İndeks Türü Kullanım Alanı Avantajı Dezavantajı
B-Tree Eşitlik ve aralık aramaları Çok amaçlı, hızlı Yazma işlemlerinde maliyetli
Hash Sadece tam eşitlik (=) Çok hızlı Aralık araması desteklemez
GIN JSONB, dizi (array) verileri Karmaşık veri tipleri İndeks boyutu büyüktür

Adım 5: İndeksleme Stratejisinde Yaygın Hatalar ve Kaçınma Yolları

Geliştiricilerin yaptığı en büyük hata, indekslenen sütun üzerinde fonksiyon kullanmaktır. Fonksiyon kullanıldığında, veritabanı motoru indeksi görmezden gelir ve tabloyu taramaya başlar.

-- Hatalı Kullanım: İndeks devre dışı kalır
SELECT * FROM kullanicilar WHERE YEAR(kayit_tarihi) = 2026;

-- Doğru Kullanım: İndeks aktif çalışır
SELECT * FROM kullanicilar WHERE kayit_tarihi >= '2026-01-01' AND kayit_tarihi < '2027-01-01';

Ayrıca, SELECT * kullanmak yerine sadece ihtiyacınız olan sütunları seçmek, indekslerin "Covering Index" (Kapsayan İndeks) olarak kullanılmasını sağlar ve veritabanının tabloya gitmesine gerek kalmadan doğrudan indeksten veri dönmesini sağlar.

Kritik Güvenlik Uyarısı: İndeksleme stratejileri veritabanı performansını artırsa da, SQL Injection saldırılarına karşı her zaman parametreli sorgular (Prepared Statements) kullanın. İndeksler, kötü niyetli sorguların veritabanını kilitlemesini engellemez; sadece sorgu süresini kısaltır.

Adım 6: İndeks Bakımı ve İzleme

Zamanla tablolar güncellendikçe indeksler parçalanabilir (fragmentation). PostgreSQL gibi sistemlerde REINDEX komutu, MySQL'de ise OPTIMIZE TABLE komutu indeksleri yeniden düzenleyerek performansı optimize eder.

-- İndeksleri optimize etme
REINDEX TABLE siparisler;

Düzenli olarak "kullanılmayan indeksleri" tespit edin. pg_stat_user_indexes gibi sistem tablolarını sorgulayarak, hiç kullanılmayan indeksleri silmek, yazma işlemlerindeki yükü azaltacaktır.

Sıkça Sorulan Sorular

Her sütuna indeks eklersem ne olur?

Veritabanınızın okuma hızı bir miktar artabilir ancak her INSERT, UPDATE veya DELETE işleminde veritabanı tüm indeksleri güncellemek zorunda kalacağı için yazma performansınız ciddi şekilde düşer ve disk kullanımınız aşırı artar.

Bileşik indekste sütunların sırası neden önemlidir?

Veritabanı, bileşik indeksi soldan sağa doğru okur. Eğer indeksiniz (A, B) ise ve siz sadece B sütununa göre sorgu yaparsanız, veritabanı indeksi kullanamaz. Bu yüzden en sık kullanılan filtreyi en başa koymalısınız.

İndeksler ne zaman güncellenir?

Veritabanı yönetim sistemi, tabloya bir veri eklendiğinde veya güncellendiğinde indeksleri otomatik olarak günceller. Bu yüzden indeks sayısı arttıkça veri yazma hızı düşer.

Kapsayan İndeks (Covering Index) nedir?

Sorgudaki tüm sütunların (SELECT edilenler ve WHERE koşulundakiler) indeksin içinde yer aldığı durumdur. Bu sayede veritabanı ana tabloya hiç bakmadan sadece indeksi okuyarak sonucu döndürür.

Küçük tablolarda indeksleme gerekli midir?

Hayır, genellikle 1000 satırdan az olan tablolarda indeksleme yapmak, veritabanının tabloyu belleğe alıp taramasından daha yavaş olabilir. İndeksleme, büyük veri setleri için bir optimizasyon aracıdır.

İleri Düzey İndeksleme Senaryosu: Gerçek Dünya Uygulaması

Teorik bilgileri pekiştirmek adına, e-ticaret platformlarında sıkça karşılaşılan "Sipariş Geçmişi" sorgulama senaryosunu ele alalım. Milyonlarca satırlık bir orders tablonuz olduğunu ve kullanıcıların belirli bir tarih aralığındaki tamamlanmış siparişlerini görmek istediğini varsayalım.

Senaryo: user_id, status ve created_at sütunlarını içeren bir sorgu.

-- Yavaş çalışan sorgu örneği
SELECT order_id, total_amount 
FROM orders 
WHERE user_id = 4523 
  AND status = 'COMPLETED' 
  AND created_at BETWEEN '2023-01-01' AND '2023-12-31'
ORDER BY created_at DESC;

Bu sorguda en yüksek seçiciliğe (selectivity) sahip olan user_id sütununu başa alarak bir bileşik indeks oluşturmak, veritabanı motorunun arama alanını anında daraltmasını sağlar. İndeks yapısı şu şekilde olmalıdır:

-- Performans odaklı indeks oluşturma
CREATE INDEX idx_orders_user_status_date 
ON orders (user_id, status, created_at DESC);

İndeks Performansını İzleme ve Hata Ayıklama (Debugging)

Bir indeksin gerçekten kullanılıp kullanılmadığını anlamak için tahmin yürütmek yerine veritabanı motorunun sunduğu analiz araçlarını kullanmalısınız. PostgreSQL veya MySQL gibi sistemlerde EXPLAIN ANALYZE komutu, sorgu planını detaylıca gösterir.

İndeks Etkinliğini Analiz Etme Adımları

  • Index Scan vs Sequential Scan: Eğer EXPLAIN çıktısında Seq Scan görüyorsanız, veritabanı indeksinizi kullanmıyor demektir. Bu durum genellikle indeksin veri türüyle uyumsuz olması veya sorguda sütun üzerinde fonksiyon kullanılması (örn: WHERE YEAR(created_at) = 2023) nedeniyle oluşur.
  • Sargable Sorgular Yazın: İndekslerin çalışması için sorguların "Search ARGumentable" olması gerekir. Sütun üzerinde işlem yapmaktan kaçının.
-- Hatalı (İndeksi devre dışı bırakır)
SELECT * FROM orders WHERE DATE(created_at) = '2023-05-01';

-- Doğru (İndeksi kullanır)
SELECT * FROM orders WHERE created_at >= '2023-05-01' AND created_at < '2023-05-02';
İpucu: Eğer sorgunuzda LIKE '%terim' şeklinde bir arama yapıyorsanız, standart B-Tree indeksleri işe yaramayacaktır. Bu gibi durumlarda pg_trgm (Trigram) veya Full-Text Search indekslerini değerlendirmeniz gerekir.

Deployment ve İndeks Yönetimi

Canlı sistemlerde büyük tablolara indeks eklemek, veritabanını kilitleyebilir (lock). Bu, uygulamanızın geçici olarak yanıt vermemesine neden olur. Bu riski yönetmek için modern veritabanı yönetim sistemlerinin sunduğu CONCURRENTLY özelliğini kullanmalısınız.

-- Canlı sistemde güvenli indeks oluşturma (PostgreSQL)
CREATE INDEX CONCURRENTLY idx_user_email ON users(email);

Bu komut, tabloyu kilitlemeden arka planda indeks oluşturur. İşlem biraz daha uzun sürer ancak kullanıcı deneyimini kesintiye uğratmaz. Deployment süreçlerinize bu yöntemi dahil ederek veritabanı kararlılığını koruyabilirsiniz.

Sonuç

Veri indeksleme stratejisi, uygulamanızın ölçeklenebilirliği için hayati bir beceridir. Adım adım uyguladığınız bu yöntemlerle, EXPLAIN analizleri yaparak, doğru indeks türlerini seçerek ve gereksiz indekslerden kaçınarak veritabanı performansınızı 2026 yılı standartlarına taşıyabilirsiniz. Bir sonraki adım olarak, veritabanı şemanızdaki yavaş sorguları belirleyip, bu rehberdeki teknikleri uygulayarak performans artışını ölçümlemenizi öneririm.

Sorumluluk Reddi: Veritabanı optimizasyonu yapmadan önce mutlaka üretim ortamındaki verilerinizin tam bir yedeğini alın. Yanlış indeksleme yapılandırmaları, karmaşık sistemlerde beklenmedik kilitlenmelere (deadlock) yol açabilir.

Bu yazıya tepkinizi paylaşın:
Zeynep Çelik

Modern yaşam ipuçları ve kişisel gelişim üzerine içerik tasarlıyorum. Günlük hayatı kolaylaştıran hızlı ve etkili çözüm odaklı yazılar yazmayı seviyorum.

Yorumlar (0)

Yorum Yaz