- Katılım
- 7 Nis 2025
- Konular
- 367
- Mesajlar
- 780
- Çözümler
- 1
- Tepkime puanı
- 121
- Puan
- 93
- Konum
- İstanbul
- Web sitesi
- forumagel.com
Daha önceki bölümlerde, özellikle Sorgu Yürütme Planlarını (Bölüm 8) incelerken indekslerin, veritabanı sorgularının performansını artırmada ne kadar kritik bir rol oynadığından bahsetmiştik. İndeksler, bir kitaptaki fihrist veya dizin gibidir; veritabanı sisteminin aradığı verilere tüm tabloyu taramak yerine doğrudan veya daha hızlı bir yoldan ulaşmasını sağlar. Ancak indekslemenin de farklı türleri ve bu türleri ne zaman ve nasıl kullanacağınıza dair stratejiler bulunur. Doğru indeksleme, uygulamanızın hızını önemli ölçüde artırabilirken, yanlış veya aşırı indeksleme performansı düşürebilir ve depolama alanı israfına yol açabilir.
Başlıca İndeks Türleri
Farklı Veritabanı Yönetim Sistemleri (DBMS) farklı indeks türlerini destekleyebilir, ancak temel kavramlar genellikle benzerdir:
Doğru sütunları indekslemek, performans artışının anahtarıdır. İndekslemeyi düşünmeniz gereken sütunlar:
(Kümelenmiş indeks genellikle tablo oluşturulurken
İndeks Bakımı ve Performans
İndeksler zamanla parçalanabilir (fragmentation), bu da performanslarını düşürür. Ayrıca, tabloların içeriği değiştikçe indekslerin dayandığı istatistikler eskir. Daha önce (Bölüm 13) bahsettiğimiz gibi, indeksleri yeniden düzenlemek veya yeniden oluşturmak ve istatistikleri güncellemek, indekslerin etkinliğini korumak için düzenli olarak yapılması gereken bakım görevleridir.
İndeksleme, veritabanı performans optimizasyonunun temel direklerinden biridir. Ancak dengeli bir yaklaşım gerektirir; her sütunu indekslemek genellikle kötü performansa yol açar. Sorgu yürütme planlarını (Bölüm 8) kullanarak indekslerinizin kullanılıp kullanılmadığını ve ne kadar etkili olduğunu anlamak, indeksleme stratejinizi geliştirmenize yardımcı olacaktır.
Bu bölümde indeks türlerini, hangi sütunları indeksleyeceğinize dair stratejileri ve indeks oluşturma temellerini ele aldık.
Veritabanı performansını etkileyen başka faktörler ve daha ileri optimizasyon teknikleri de bulunmaktadır. Bir sonraki bölümde, sorguları daha verimli hale getirmek için kullanabileceğimiz diğer bazı ileri optimizasyon yöntemlerine veya farklı veritabanı modellerini (NoSQL) daha derinlemesine incelemeye devam edebiliriz. Gelişmiş performans ayarları mantıklı bir sonraki adım olabilir.
Başlıca İndeks Türleri
Farklı Veritabanı Yönetim Sistemleri (DBMS) farklı indeks türlerini destekleyebilir, ancak temel kavramlar genellikle benzerdir:
- Kümelenmiş İndeks (Clustered Index):
- Veritabanı tablosundaki verinin fiziksel olarak disk üzerinde hangi sırada saklanacağını belirler.
- Bir tabloda yalnızca bir adet kümelenmiş indeks olabilir, çünkü veri sadece tek bir fiziksel sırada saklanabilir.
- Genellikle tablonun
PRIMARY KEY
'i otomatik olarak kümelenmiş indeks olarak oluşturulur (eğer aksi belirtilmemişse). - Veriye hızlı erişim sağlar ve aralık tabanlı sorgularda çok etkilidir.
- Kümelenmemiş İndeks (Non-Clustered Index):
- Verinin fiziksel saklanma sırasını etkilemez.
- Ayrı bir yapıda (genellikle B-tree ağacı şeklinde) saklanır. Bu yapı, indekslenmiş sütun değerlerini ve bu değerlere karşılık gelen veri satırlarının fiziksel konumlarını veya kümelenmiş indeks anahtarını içerir.
- Bir tabloda birden fazla kümelenmemiş indeks olabilir.
- Belirli satırlara hızlı erişim sağlar, ancak verinin tamamını çekmek için ek bir "lookup" (veri satırına gitme) adımı gerekebilir (Eğer kapsayan indeks değilse).
- Benzersiz İndeks (Unique Index):
- İndekslenen sütunlardaki değerlerin benzersiz olmasını sağlar.
- Hem kümelenmiş hem de kümelenmemiş olabilir.
PRIMARY KEY
veUNIQUE
kısıtlamaları otomatik olarak benzersiz indeksler oluşturur. Veri bütünlüğünü sağlamanın yanı sıra sorgu performansını da artırır.
- Tam Metin İndeks (Full-Text Index):
- Büyük metin alanlarındaki kelime veya ifadeleri hızlı bir şekilde aramak için kullanılır.
- Geleneksel SQL
LIKE
aramalarından çok daha gelişmiş ve performanslı metin arama yetenekleri sunar.
- Kapsayan İndeks (Covering Index):
- Bir kümelenmemiş indekstir ancak
SELECT
ifadesinde ihtiyaç duyulantüm sütunları
içerir (indeks anahtarı sütunlarına ek olarak "dahil edilen" - included - sütunlar olarak). - Bu sayede veritabanı sistemi, sorguyu yanıtlamak için ana tabloya dönmek zorunda kalmaz, sadece indeksi okuması yeterli olur. Bu da performansı önemli ölçüde artırır.
- Bir kümelenmemiş indekstir ancak
- Bileşik/Birleşik İndeks (Composite/Compound Index):
- Birden fazla sütunu içeren indekstir.
- Sorguların
WHERE
,ORDER BY
veyaGROUP BY
yan tümcelerinde birden fazla sütunu birlikte kullandığı durumlarda faydalıdır. - Sütunların indeksteki sırası çok önemlidir. Sorgunun sadece bileşik indeksin baştaki sütunlarını kullandığı durumlarda indeks etkin olabilir.
Doğru sütunları indekslemek, performans artışının anahtarıdır. İndekslemeyi düşünmeniz gereken sütunlar:
WHERE
Yan Tümcesinde Sık Kullanılan Sütunlar: Sorguların çoğu, veriyi filtrelemek içinWHERE
kullanır. Filtreleme koşulundaki sütunları indekslemek aramayı hızlandırır.JOIN
Koşullarında Kullanılan Sütunlar: Tabloları birleştirirken kullanılan sütunlar (genellikle yabancı anahtarlar -FOREIGN KEY
) indekslenirseJOIN
işlemleri çok daha hızlı olur.FOREIGN KEY
sütunlarına indeks eklemek yaygın ve iyi bir pratiktir.ORDER BY
veGROUP BY
Yan Tümcelerinde Kullanılan Sütunlar: Sorgu sonuçlarını sıralamak veya gruplamak maliyetli işlemler olabilir. Bu yan tümcelerde kullanılan sütunları indekslemek, veritabanının sıralama veya gruplama için indeksi kullanmasına olanak tanıyarak performansı artırabilir.SELECT
Listesindeki Sütunlar (Kapsayan İndeksler İçin): Eğer bir sorgununSELECT
listesindeki tüm sütunlar bir indekste (anahtar veya dahil edilmiş sütunlar olarak) bulunuyorsa, veritabanı sadece indeksi okuyarak sorguyu yanıtlayabilir (Kapsayan İndeks). Bu, özellikle sık çalıştırılan ve belirli sütunları çeken sorgular için çok etkili olabilir.- Yüksek Kardinaliteli Sütunlar (Çok Farklı Değeri Olan Sütunlar): Benzersiz veya çok farklı değer içeren sütunlar (
UserID
,Email
gibi) indeksleme için iyi adaylardır çünkü indeks, aranan değeri hızlıca bulmak için dar bir sonuç kümesi sağlar. Düşük kardinaliteli sütunlar (örneğin, cinsiyet, medeni durum) tek başına indekslendiğinde genellikle çok etkili olmaz.
Kod:
-- Basit bir kümelenmemiş indeks oluşturmaCREATE INDEX idx_tabloadi_sutunadi ON tabloadi (sutunadi);
-- Birden fazla sütunu içeren (bileşik) bir kümelenmemiş indeks oluşturmaCREATE INDEX idx_tabloadi_sutun1_sutun2 ON tabloadi (sutun1, sutun2);
-- Benzersiz bir kümelenmemiş indeks oluşturmaCREATE UNIQUE INDEX idx_tabloadi_benzersizsutun ON tabloadi (benzersizsutun);
-- Kapsayan bir indeks oluşturma (SQL Server örneği)CREATE INDEX idx_tabloadi_sutunA_sutunB_Covered ON tabloadi (sutunA, sutunB) INCLUDE (sutunC, sutunD);
PRIMARY KEY
veya CREATE CLUSTERED INDEX
ile tanımlanır.)İndeks Bakımı ve Performans
İndeksler zamanla parçalanabilir (fragmentation), bu da performanslarını düşürür. Ayrıca, tabloların içeriği değiştikçe indekslerin dayandığı istatistikler eskir. Daha önce (Bölüm 13) bahsettiğimiz gibi, indeksleri yeniden düzenlemek veya yeniden oluşturmak ve istatistikleri güncellemek, indekslerin etkinliğini korumak için düzenli olarak yapılması gereken bakım görevleridir.
İndeksleme, veritabanı performans optimizasyonunun temel direklerinden biridir. Ancak dengeli bir yaklaşım gerektirir; her sütunu indekslemek genellikle kötü performansa yol açar. Sorgu yürütme planlarını (Bölüm 8) kullanarak indekslerinizin kullanılıp kullanılmadığını ve ne kadar etkili olduğunu anlamak, indeksleme stratejinizi geliştirmenize yardımcı olacaktır.
Bu bölümde indeks türlerini, hangi sütunları indeksleyeceğinize dair stratejileri ve indeks oluşturma temellerini ele aldık.
Veritabanı performansını etkileyen başka faktörler ve daha ileri optimizasyon teknikleri de bulunmaktadır. Bir sonraki bölümde, sorguları daha verimli hale getirmek için kullanabileceğimiz diğer bazı ileri optimizasyon yöntemlerine veya farklı veritabanı modellerini (NoSQL) daha derinlemesine incelemeye devam edebiliriz. Gelişmiş performans ayarları mantıklı bir sonraki adım olabilir.