PostgreSQL ile index yönetimi

İbrahim SAYAR
Naylalabs
Published in
3 min readApr 19, 2022

Bu yazımda size kısa ve hızlı bir şekilde index yönetimi nasıl yapılır, küçük tüyolarla ve örneklerle açıklayacağım.

Index Nedir?

Öncelikle index hakkında çok az bilgi vermek istiyorum.

Indexlenmemiş veriler.

Elinizde bir kitap olduğunu varsayın. Biliyorsunuz bazı kitapların giriş, gelişme ve sonuç bölümleri olur. Okumaya başlar ve sonra bitirirsiniz.

Indexlenmiş veriler.

Bazı kitapların ise hangi konunun hangi bölümde ve hangi sayfada olduğu ile ilgili bilgiler sunduğu “İçindekiler” kısmı vardır.

İşte indexlenmiş ve indexlenmemiş alanlar hakkında bu iki kitabı örnek verebiliriz.

Mesela veritabanınızda 6 satır kayıt olduğunu varsayalım. Siz bir sorgu çalıştırdığınızda SQL bu 6 kayıt arasında sizin çalıştırdığınız sorguyla eşleşen kayıtları bulur ve size getirir. Tüm satırları tek tek arar.

Sorgunun her satırda tek tek arandığı yöntem, indexlenmemiş veriler.

Eğer indexleme yaparsanız, veritabanınızda sorgunuz ve kayıtlarınız arasına bir katman daha yerleştirilir ve sayfalara bölünür. Örnek olarak 6 kayıt ikiye bölünerek, her 3 kaydın bilgilerinin tutulduğu gruplar oluşturulur. Bu şekilde bir sorgu çalıştırdığınızda kayıtlar bu gruplarda aranır. Böylece tüm kayıtlar gezilmeden, bulunan kayıt size hızlı bir şekilde döndürülür.

Sorgunun index bölümlerinde arandığı yöntem, indexlenmiş veriler.

Indexlerin çalışma yöntemini anladığımıza göre teknik tarafa geçelim.

Ben veritabanımda indexleme işlemini yaparken birkaç tane PostgreSQL kaynağı okudum ve bu kaynaklara göre indexleme yaptım. Bu kaynakları yazının altında sizinle paylaşacağım.

Ben index yapmadan önce normal bir sorgumu SQL aracımda çalıştırıyorum ve sonucu analiz ediyorum.

SELECT * FROM table WHERE column = 1

Bu sorguyu çalıştırdığımızda karşımıza seçtiğimiz veriler gelecektir. PostgreSQL’de yazdığınız sorguyu analiz etmek istiyorsanız sorgunun başına ‘explain’ ve ‘analyze’ eklemeniz gerekiyor. Sorgumuz son olarak bu şekli alıyor.

EXPLAIN ANALYZE SELECT * FROM table WHERE column = 1

Sorgumuzu çalıştırdığımızda, karşımıza sorgumuz ile ilgili analizler çıkacaktır.

Seq Scan on table (cost=0.00..22597.15 rows=1 width=1289) (actual time=9.397..40.336 rows=1 loops=1)Filter: (column = 1)Rows Removed by Filter: 18251Planning Time: 0.533 msExecution Time: 40.367 ms

Gördüğünüz gibi sorgumuz 40.367 ms sürede sonuçlanıyor. Aynı alana index ekleyip daha sonra analiz kodumuzu çalıştıracağız, index ekleme kodumuz:

CREATE INDEX index_name ON table (column(s));

Şimdi tekrar sorgumuzu çalıştırdığımızda alttaki sonuca ulaşıyoruz.

Index Scan using index_name on table (cost=0.29..8.31 rows=1 width=1289) (actual time=0.043..0.044 rows=1 loops=1)Index Cond: (column = 1)Planning Time: 0.653 msExecution Time: 0.071 ms

Gördüğünüz gibi sorgumuzun çalışma süresi 0.071 ms’ye kadar düşüyor.

PostgreSQL’de birden fazla index veri tipi bulunuyor alttaki paylaştığım kaynaklardan daha fazla bilgi edinebilirsiniz. Bu yazıda kolay ve anlaşılır şekilde anlatmaya çalıştım. Herhangi bir sorunuzda size yanıt verebilirim. Şimdiden mutlu indexlemeler. :)

Kaynaklar.

Index Tipleri: https://www.postgresql.org/docs/current/indexes-types.html

Analiz: https://www.postgresql.org/docs/current/sql-explain.html

Teşekkürler.

Muhammet Ateş @beyzacalgic

--

--