Sql İle Veritabanı İndeksleme İşlemi Nasıl Yapılır?

Sql İle Veritabanı İndeksleme İşlemi Nasıl Yapılır?
Sql İle Veritabanı İndeksleme İşlemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

İndeksleme işlemlerine başlamadan önce, veritabanı üzerinde yeterli yetkilere (genellikle INDEX veya ALTER yetkisi) sahip olduğunuzdan emin olmalısınız. Çalışma ortamınızda PostgreSQL 16+ veya MySQL 8.4+ gibi güncel bir sürümün kurulu olması, performans özelliklerinden tam yararlanmanızı sağlar.

  • Veritabanı Yönetim Aracı: DBeaver, pgAdmin veya MySQL Workbench gibi görsel bir arayüz.
  • Örnek Veri Seti: İndekslemenin etkisini görmek için en az 100.000 satırlık bir tablo.
  • Temel SQL Bilgisi: SELECT, WHERE ve EXPLAIN komutlarına aşinalık.

İndeksleme Mantığı ve Neden Gereklidir?

Veritabanında bir sorgu çalıştırdığınızda, indeks yoksa sistem "Full Table Scan" (Tam Tablo Taraması) yapar. Yani, aranan veriyi bulmak için tablodaki her bir satırı tek tek okur. Bu durum, veri miktarı arttıkça sorgu süresinin doğrusal olarak artmasına neden olur. İndeksler, veriyi sıralı bir ağaç yapısında (B-Tree) tutarak, tarama süresini logaritmik seviyeye indirir.

İndeksleme işlemi, okuma (SELECT) işlemlerini hızlandırırken, yazma (INSERT, UPDATE, DELETE) işlemlerini biraz yavaşlatır. Bunun nedeni, her veri değişikliğinde indeks yapısının da güncellenmesi gerekliliğidir. Bu yüzden, indeksleri sadece sık sorgulanan sütunlar için oluşturmalısınız.

Adım Adım Tek Sütunlu İndeks Oluşturma

En temel indeks türü, belirli bir sütun üzerinde oluşturulan tek sütunlu indekstir. Örneğin, bir e-ticaret uygulamasında kullanıcıların e-posta adresleri üzerinden giriş yaptığı bir senaryoda, email sütununa indeks eklemek sorgu hızını dramatik şekilde artırır.

-- Kullanıcılar tablosunda email sütununa indeks oluşturma
CREATE INDEX idx_users_email ON users(email);

Bu komut, users tablosundaki email sütunu için idx_users_email adında bir indeks oluşturur. İndeks isimlendirme standartlarına uymak, karmaşık veritabanlarında yönetimi kolaylaştırır.

Çok Sütunlu (Composite) İndeksler ile Performans

Sorgularınızda genellikle birden fazla sütunu WHERE veya JOIN koşullarında kullanıyorsanız, çok sütunlu indeksler (Composite Index) tercih etmelisiniz. Burada dikkat edilmesi gereken en önemli nokta, sütunların sıralamasıdır.

-- Hem kategori hem de durum sütununa göre arama yapılıyorsa
CREATE INDEX idx_products_category_status ON products(category_id, status);

Bu indeks, WHERE category_id = 5 AND status = 'active' gibi sorgularda mükemmel çalışır. Ancak, sadece status sütununa göre yapılan aramalarda bu indeksin verimliliği düşebilir. Sık kullanılan filtreleme sütununu en başa koymak, indeksin isabet oranını (cardinality) artırır.

İndeks Performansını Test Etme: EXPLAIN Kullanımı

Bir indeksin işe yarayıp yaramadığını anlamanın tek yolu EXPLAIN komutunu kullanmaktır. Bu komut, veritabanının sorguyu nasıl çalıştıracağını ve indeks kullanıp kullanmadığını gösterir.

-- Sorgu planını analiz etme
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';

Çıktıda Index Scan ifadesini görüyorsanız, indeksiniz başarıyla kullanılıyor demektir. Eğer Seq Scan (Sequential Scan) ifadesini görüyorsanız, veritabanı hala tüm tabloyu tarıyor demektir; bu durumda indeksin yanlış tanımlanmış veya kullanılmıyor olduğunu anlarsınız.

İndeksleme Yöntemleri Karşılaştırma Tablosu

İndeks Türü Kullanım Alanı Avantajı Dezavantajı
B-Tree Eşitlik ve aralık sorguları Çok yönlü ve standart Büyük metinlerde yavaş
Unique Tekil değerler (TCKN, Email) Veri bütünlüğü sağlar Kısıtlayıcıdır
Full-Text Metin içinde arama Kelime bazlı hızlı arama Depolama alanı tüketir

Kritik Uyarı: Üretim ortamında (Production) indeks eklerken dikkatli olun. Çok büyük tablolarda CREATE INDEX komutu tabloyu geçici olarak kilitleyebilir (Locking). PostgreSQL gibi sistemlerde CONCURRENTLY anahtar kelimesini kullanarak tabloyu kilitlemeden indeks oluşturmayı tercih edin.

Sıkça Sorulan Sorular

Her sütuna indeks eklemeli miyim?

Hayır. Fazla indeks, veritabanı yazma işlemlerini (INSERT/UPDATE) ciddi oranda yavaşlatır ve disk alanını gereksiz tüketir. Sadece WHERE, JOIN ve ORDER BY ifadelerinde sıkça kullanılan sütunlara indeks eklenmelidir.

İndekslerin güncel olduğunu nasıl anlarım?

Veritabanı sistemleri indeksleri otomatik günceller. Ancak, çok fazla veri silme veya güncelleme işlemi yapıldıysa, indeksler "parçalanabilir" (fragmentation). Bu durumda REINDEX komutu ile indeksleri yeniden oluşturmak gerekebilir.

Unique indeks ile Primary Key arasındaki fark nedir?

Primary Key, tabloyu tanımlayan anahtardır ve otomatik olarak NOT NULL ve UNIQUE özelliklerine sahiptir. Unique indeks ise, bir sütunun veya sütun grubunun benzersiz olmasını sağlar ancak NULL değerlere izin verebilir.

İndeksler ne zaman kullanılmaz?

Tablo çok küçükse (örneğin 100 satır altı), veritabanı motoru indeksi kullanmanın tabloyu taramaktan daha maliyetli olduğunu düşünerek indeksi görmezden gelebilir. Ayrıca, WHERE koşulunda sütun üzerinde fonksiyon kullanırsanız (örneğin WHERE UPPER(name) = 'AHMET'), indeks devre dışı kalır.

İndeksleri nasıl silerim?

İhtiyaç kalmayan veya performansı düşüren indeksleri DROP INDEX index_adı; komutu ile silebilirsiniz. Ancak silmeden önce mutlaka kullanım istatistiklerini kontrol edin.

Kod Güvenliği Sorumluluk Reddi: Bu makaledeki SQL komutları genel bilgilendirme amaçlıdır. Veritabanı üzerinde işlem yapmadan önce mutlaka yedek alınız. SQL Injection riskine karşı, uygulama tarafında her zaman Prepared Statements (hazırlanmış ifadeler) kullanınız.

Gelişmiş İndeksleme Stratejileri ve İleri Optimizasyon Teknikleri

İndeksleme sadece bir sütuna CREATE INDEX komutu yazmaktan ibaret değildir. Büyük ölçekli veritabanlarında indekslerin disk üzerindeki kapladığı alan ve yazma (INSERT/UPDATE) işlemlerine olan maliyeti, sistemin genel başarımı üzerinde doğrudan etkilidir. İleri seviye optimizasyon için aşağıdaki stratejileri göz önünde bulundurmalısınız.

Kapsayıcı İndeksler (Covering Indexes) ile Sorgu Hızlandırma

Bir sorgunun ihtiyaç duyduğu tüm sütunlar indeksin içerisinde yer alıyorsa, veritabanı motoru "Table Lookup" (tabloya gitme) işlemine gerek duymaz. Bu durum, veritabanı performansını maksimize eden en kritik tekniklerden biridir. Sorgu, sadece indeks ağacını okuyarak sonucu döndürür.

-- Kullanıcılar tablosunda sadece e-posta ve isim sorgulanıyorsa:
CREATE INDEX idx_user_email_name ON users(email, name);

-- Bu sorgu artık "Index Only Scan" yapar:
SELECT email, name FROM users WHERE email = 'test@example.com';

İndekslerin Yazma Performansına Etkisi ve "Fill Factor"

Her indeks, bir veri eklendiğinde veya güncellendiğinde veritabanı tarafından yeniden düzenlenmelidir. Çok fazla indeks, özellikle yüksek trafikli yazma işlemlerinde (high-write workloads) darboğaz yaratabilir. Bu noktada Fill Factor kavramı devreye girer. İndeks sayfalarının ne kadarının dolu olacağını belirleyerek, sayfa bölünmelerini (page splits) minimize edebilirsiniz.

Örneğin, SQL Server veya PostgreSQL gibi sistemlerde indeks oluştururken boşluk bırakmak, verinin araya eklenmesi durumunda sayfanın yeniden düzenlenmesini geciktirir:

-- %80 doluluk oranı ile indeks oluşturma örneği (Sistem bazlı değişebilir)
CREATE INDEX idx_orders_date ON orders(order_date) WITH (FILLFACTOR = 80);

İndeksleme Sürecinde Hata Ayıklama ve İzleme

Uygulamanız canlıya alındıktan sonra, oluşturduğunuz indekslerin gerçekten kullanılıp kullanılmadığını takip etmek hayati önem taşır. Kullanılmayan indeksler (unused indexes) hem disk alanını işgal eder hem de yazma işlemlerini gereksiz yere yavaşlatır.

Kullanılmayan İndeksleri Tespit Etme

Veritabanı yönetim sistemleri, hangi indeksin ne kadar süredir sorgularda kullanılmadığını takip eden istatistik tablolarına sahiptir. PostgreSQL üzerinde kullanılmayan indeksleri şu şekilde sorgulayabilirsiniz:

SELECT 
    relname AS table_name, 
    indexrelname AS index_name, 
    idx_scan AS number_of_scans
FROM pg_stat_user_indexes
WHERE idx_scan = 0 
AND indexrelname NOT LIKE '%pkey';

İndeks Parçalanması (Fragmentation) ve Bakım

Zamanla veriler silindikçe veya güncellendikçe indeks sayfalarında boşluklar oluşur. Bu durum "Index Fragmentation" olarak adlandırılır ve sorgu performansını düşürür. Düzenli bakım planları ile indeksleri yeniden oluşturmak (rebuild) veya birleştirmek (reorganize) gerekir.

  • Reorganize: İndeks sayfalarını fiziksel olarak sıralar, daha az kaynak tüketir.
  • Rebuild: İndeksi sıfırdan oluşturur, daha fazla kaynak tüketir ancak daha etkilidir.

İndekslerinizi veritabanı bakım pencerelerinde (düşük trafikli saatlerde) ALTER INDEX ... REBUILD komutu ile optimize ederek sistemin her zaman en yüksek hızda çalışmasını sağlayabilirsiniz.

Sonuç

Sql ile veritabanı indeksleme işlemi, doğru uygulandığında uygulamanızın performansını birkaç kat artırabilecek en etkili yöntemdir. İndeksleri sadece ihtiyaç duyulan sütunlara eklemek, EXPLAIN ile sorgu planlarını düzenli kontrol etmek ve indeks türlerini (B-Tree, Unique, Composite) doğru seçmek bir yazılımcının temel yetkinliklerindendir. Bir sonraki adım olarak, veritabanınızdaki yavaş sorguları tespit etmek için "Slow Query Log" kayıtlarını incelemeyi ve analiz etmeyi öğrenmenizi öneririm.

Bu yazıya tepkinizi paylaşın:
Selin Demir

Sürdürülebilir yaşam ve kişisel verimlilik üzerine odaklanan bir içerik üreticisiyim. Zaman yönetimi ve organizasyonel ipuçları konusunda okuyuculara yol gösteriyorum.

Yorumlar (0)

Yorum Yaz