Skip to content

SQL İndeksleme açıklaması

SQL indeks türleri, tasarım desenleri ve bakımını kapsayan hızlı bir başvuru kılavuzu.

İndeksler, okuma hızını kazanmak için depolamadan ve yazma hızından vazgeçer. Yapıyı seçin, satır kapsamını daraltın, şişmeyi yönetin.

Referans tablosu · 31 kayıt
31 of 31 rows
İndeks türleri
Eş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.
Yaprak 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.
Anahtarları 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.
Yalnı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.
Genelleş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.
Genelleş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.
Alan 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.
Blok 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.
Satı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.
MySQL 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.
Her 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.
DESC 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.
Optimizö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
Ç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.
Bir 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.
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.
Yinelenen 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.
Kolonları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.
İş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.
Sorguyu 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.
Yabancı 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
Plan 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.
Planlayı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.
Her 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.
İ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.
Okuma 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.
İ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.
Şişmiş indeksi yeniden kurar. Ölü tuple'lardan alan geri kazanır.Üretimde REINDEX CONCURRENTLY kullanın. Olmadan kilitler yazmaları engeller.
MVCC 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.
Yazma 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.
Tabloyu 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.