İndeks türleri ⤢ B-treeEşitlik, aralık ve sıralı taramalar için dengeli ağaç. Çoğu veritabanında varsayılan. =, <, >, BETWEEN, ORDER BY için kullanın. Tam metin arama için kullanmayın. ⤢ ClusteredYaprak düzeyi tablonun kendisi olan indeks. Satırlar anahtar sırasına göre saklanır. Tablo başına bir tane. InnoDB birincil anahtar üzerinde kümelenir. Birincil anahtarı olmayan SQL Server tabloları heap'tir. ⤢ NonclusteredAnahtarları ve ana tabloya bir işaretçi tutan ayrı yapı. Tablo başına çok sayıda olabilir. Heap üzerinde satır kimliği (row ID) saklar. Kümelenmiş tabloda kümeleme anahtarını saklar. ⤢ HashYalnızca eşitlik aramaları için hash tablosu. Sabit süreli tam eşleşme. Yalnızca = işlemleri için kullanın; aralıklar ve sıralama B-tree gerektirir. SQL Server'ın bellek için optimize edilmiş hash indeksi, satır sayısına yakın bir bucket sayısı ister. ⤢ GINGenelleştirilmiş ters indeks (Generalized Inverted Index). Değerleri satırlara eşler. Diziler ve tam metin için tasarlanmıştır. jsonb, diziler, tsvector, üçlü (trigram) arama için kullanın. Kurulumu B-tree'den yavaştır. ⤢ GiSTGenelleştirilmiş arama ağacı (Generalized Search Tree). Skaler olmayan türler ve örtüşme sorguları için genişletilebilir. Geometrik aralıklar, kNN ve dışlama kısıtlamaları için kullanın. pg_trgm, LIKE'ı hızlandırır. ⤢ SP-GiSTAlan bölümlü GiST. Veriyi radix veya quad ağaçlarıyla örtüşmeyen bölgelere böler. Noktalar, IP ön ekleri ve ön ek eşleştirmesi için kullanın. Örtüşme sorguları için değil; onlar için GiST kullanın. ⤢ BRINBlok aralığı indeksi (Block Range Index). Blok aralığı başına min/maks saklar. Çok küçük ayak izi. Büyük, fiziksel olarak sıralı tablolarda kullanın. Kurulumu ucuz, seçiciliği zayıf. ⤢ ColumnstoreSatırlar yerine kolon segmentleri olarak saklanan indeks. Yüksek sıkıştırma, toplu yürütme. Çok satırlı ve az kolonlu analitik taramalar için kullanın. Tek satır aramaları yavaştır. ⤢ Full-textMySQL ve SQL Server'daki ayrılmış ters kelime indeksi. Metin kolonu başına kurulur. MATCH AGAINST veya CONTAINS kullanın. Postgres tam metni bunun yerine tsvector üzerinde GIN kullanır. ⤢ BitmapHer ayrık değer için bir bitmap saklayan Oracle indeksi. Her bit bir satırı işaretler. Okuma yoğun veri ambarlarında düşük kardinaliteli kolonlarda kullanın. Eşzamanlı yazmalar bitmap başına seri hale gelir. ⤢ DescendingDESC olarak tanımlanmış indeks kolonu. O kolonun anahtarları ters sırada saklanır. (a ASC, b DESC) gibi karışık sıralamalar için gerekir. Düz DESC sıralamaları normal bir indeksi tersten de okuyabilir. ⤢ InvisibleOptimizörün yok saydığı MySQL 8 indeksi. Her yazmada yine de bakımı yapılır. Etkiyi test etmek için düşürmeden önce indeksi gizleyin. Yeniden kurulum olmadan tekrar görünür yapın. Tasarım ⤢ CompositeÇok kolonlu indeks. Öndeki kolonlar sorgu filtre sırasına uymalıdır. Önce eşitlik, sonra aralık olacak şekilde sıralayın. İki tekli indeks bir bileşik indeksin yerini tutamaz. ⤢ PartialBir WHERE koşulu üzerinde kurulan indeks. SQL Server bunu filtreli indeks (filtered index) olarak adlandırır. Yalnızca eşleşen satırları kapsar. Yalnızca active='t' satırlarını indeksleyin. Boyutu ve yazma maliyetini yarıya indirir. ⤢ Covering (INCLUDE)Sonuna anahtar olmayan ek kolonlar eklenmiş B-tree. Salt indeks taramaları heap erişiminden kaçınır. Sık çekilen kolonları INCLUDE ile ekleyin. İndeksi sıralanabilir tutar. ⤢ UniqueYinelenen değerleri yasaklayan indeks. Çakışan eklemeleri reddeder. Doğal anahtarlar ve bire bir kısıtlamalar için kullanın. UNIQUE NULL çok sayıda NULL'a izin verir. ⤢ ExpressionKolonların kendisi yerine kolonların bir fonksiyonu üzerinde kurulmuş indeks. lower(email) veya date_trunc('day', created_at) ifadelerini indeksleyin. Sorgu tam olarak aynı ifadeyi tekrarlamalıdır. ⤢ Opclassİşleç sınıfı (operator class). Bir indeksin bir kolonun türünü nasıl karşılaştırıp sakladığını tanımlar. Büyük/küçük harf katlaması olmadan LIKE 'abc%' için varchar_pattern_ops ayarlayın. Varsayılanlar eşitlik ve aralıklara uyar. ⤢ Index-only scanSorguyu yalnızca indeks sayfalarından yanıtlayan plan. Heap hiç okunmaz. Çekilen her kolonun indekste veya INCLUDE listesinde olması gerekir. Vacuum görünürlük haritasını güncel tutar. ⤢ Foreign keysYabancı anahtar kolonlarına, referans veren tabloda otomatik indeks oluşmaz. Birleştiğiniz veya sildiğiniz her FK kolonunu indeksleyin. İndeks olmadan basamaklı silmeler alt tabloyu tarar. Bakım ⤢ EXPLAINPlan denetçisi. Sıralı taramaları, indeks seçimlerini ve maliyet tahminlerini gösterir. EXPLAIN (ANALYZE, BUFFERS) kullanın. 10 milyon satırlık tabloda Seq Scan, eksik indeks demektir. ⤢ ANALYZEPlanlayıcı istatistiklerini kurmak için tablo kolonlarını örnekler. Histogramlar indeks seçimini belirler. Toplu yüklemelerden sonra çalıştırın. Bayat istatistikler indeksli kolonlarda sıralı taramaya yol açar. ⤢ Over-indexingHer indeks yazma yükü ekler. INSERT, UPDATE, DELETE işlemleri indeks başına ödeme yapar. Kullanılmayan indeksleri düşürün. Kullanımı pg_stat_user_indexes içinde izleyin. ⤢ pg_stat_user_indexesİndeks başına kullanımın Postgres görünümü. İstatistik sıfırlamasından beri tarama ve okunan tuple sayılarını tutar. Kullanılmayan indeksleri bulmak için idx_scan = 0 ile filtreleyin. Sayaçları pg_stat_reset() ile sıfırlayın. ⤢ CREATE INDEX CONCURRENTLYOkuma ve yazmaları engellemeden indeks kurar. İki tablo taraması gerekir. İşlem (transaction) içinde çalışamaz. Başarısız bir kurulum, düşürülmesi gereken INVALID bir indeks bırakır. ⤢ DROP INDEXİndeksi kaldırır ve depolamasını boşaltır. Varsayılan olarak ayrıcalıklı kilit alır. Meşgul tablolarda DROP INDEX CONCURRENTLY kullanın. Kaldırmadan önce kullanım istatistiklerini kontrol edin. ⤢ REINDEXŞişmiş indeksi yeniden kurar. Ölü tuple'lardan alan geri kazanır. Üretimde REINDEX CONCURRENTLY kullanın. Olmadan kilitler yazmaları engeller. ⤢ BloatMVCC tablolarında ve indekslerinde biriken ölü tuple'lar ve sayfa boşlukları. pgstattuple ile ölçün. Sık Vacuum yapın; ölü alan baskın olduğunda REINDEX. ⤢ FillfactorYazma anında bir sayfanın doluluk yüzdesi. Boş alan gelecekteki güncellemeleri karşılar. Sıcak güncellemeli tablolarda 70-90'a düşürün. Dolu sayfalar sayfa bölmelerine yol açar. ⤢ CLUSTERTabloyu bir indekse göre fiziksel sırayla yeniden yazar. Tek seferlik işlem. Sıralı bloklar için BRIN ile eşleşir. Sıra sonraki yazmalarda korunmaz.