PostgreSQL 101: Index ve Index Türleri

PostgreSQL veritabanı tek-sütun (single-column), çok-sütun (multicolumn), kısmi-index (partial index), tekil-index (unique index), ifade indexi (expression index), dahili index (implicit index), ve eş zamanlı indexleri (concurrent index) destekler. Bunlar genel indeksleme (dizin oluşturma) yöntemleri iken, bir de index türleri vardır. PostgreSQL’in desteklediği index türleri B-tree, hash, GiSTGIN ve BRIN‘dir.

PostgreSQL Index Türleri

İndeksleme türü index oluşturma esnasında USING yöntemi ile seçilebilir. Farklı index türlerinin farklı varoluş sebepleri vardır. Örneğin, B-tree index’ler sorgular bir aralık (range) ve eşitlik operatörü içeriyorsa verimli iken, hash index’ler eşitlik operatörü kullanılıyorsa sorguda kullanılırlar.

B-tree Index

B-tree index sorguda eşitlik operatörü (=) ve aralık (range) operatörleri varsa (<, <=, >, >=, BETWEEN, ve IN) kullanılır.

Hash Index

Hash indeksler  sorguda sadece eşitlik arama operatörü varsa devreye giren index’lerdir.

my_db=# EXPLAIN SELECT COUNT(*) FROM my_table WHERE item_id = 99;
QUERY PLAN
------------------------------------------------------------------ Aggregate (cost=8.02..8.03 rows=1 width=0) 
    -> Index Scan using item_hash_index on item (cost=0.00..8.02 rows=1 width=0) 
    Index Cond: (item_id = 99) (3 rows)

GiST ve GIN Index

GiST (Generalized Search Tree) indexler kendiniz bir index metodu oluşturmak istediğinizde kullandığınız türdür. Genellikle özel bir veri formatı oluşturulduğundan bunun indexlenmesi için de özel bir metod oluşturulur. GIN (Generalized Inverted Index) index ise, tersyüz (inverted) edilmiş indexlerdir. Arama işlemlerinde daha çok kullanılır. Bu tip indexler, her kelime için bir index girdisi ve bu girdinin içinde de kelimenin geçtiği yerlerin listesini sıkıştırılmış olarak tutarlar. Birden fazla kelime ile arama yapıldığında bu tip indexler önce ilk uyuşmayı bulur ve sonra indexi kullanarak diğer kelimelerin geçmediği girdileri çıkartarak işlem yaparlar.

İki index de daha çok, özellikle full-text aramalar için oluşturulur. Full-text arama için bu indexleri oluşturma zorunluluğu yoktur, duruma özel, performans için vs kullanılır.

BRIN Index

BRIN (Block Range Index) indexler PostgreSQL 9.5 sürümünde geliştirilmiş, ve bir çok büyük veritabanı sağlayıcısında halen daha olmayan, yapılmaya çalışılan tablonun nerede ve nasıl tutulduğuna bağlı olarak çalışan indexlerdir. BRIN, çok büyük tablolarda, belirli bir sütundaki verinin disk üzerinde nereye yazıldığı ile doğal bir ilişkisi olduğunda kullanılabilir ve tüm tablo taramalarında büyük bir blok veriyi es geçerek büyük performans artışları sağlayabilir.

BRIN, büyük bir blok veriyi kompakt bir halde  özete indirger ve sorgunun daha ilk aşamasında özet üzerinden test ederek büyük bir bloğu sorgu harici bırakarak detaylı bir şekilde tarama yapacağı büyük veriyi en aza indirmiş olur. Aksi durumda çok pahalı olan “satır satır tüm tablo taraması” (full table scan) yapılacaktır.

BRIN index’ler yatay bölümlendirme (horizontal partitioning) veya sharding yapısına benzer bir performans artırıcı olarak kullanılmaktadır. BRIN index, Oracle Exadata tarafındaki “Storage Index” kavramına denk düşer dersek yanlış olmaz.