Programming

Panduan Index PostgreSQL: Dari EXPLAIN ANALYZE hingga Composite Index

Kapan membuat index, bagaimana urutan kolom memengaruhi performa, dan cara membuktikannya dengan EXPLAIN ANALYZE.

A
Azhar Banget
13 Okt 2026 2 min read 3
Kode dan database
Query yang lambat jarang disebabkan oleh PostgreSQL itu sendiri. Lebih sering, tabel dipindai penuh (*sequential scan*) karena tidak ada index yang tepat. Artikel ini membahas cara menemukan masalahnya dan memperbaikinya. ## Langkah 1: ukur dulu, jangan menebak Awali setiap optimasi dengan `EXPLAIN ANALYZE`: ```sql explain analyze select id, title from posts where status = 'published' order by published_at desc limit 6; ``` Perhatikan node `Seq Scan` pada tabel besar, nilai `actual time`, dan jumlah baris yang dibuang oleh filter. ## Langkah 2: composite index Query di atas memfilter `status` lalu mengurutkan `published_at`. Index yang cocok: ```sql create index posts_status_published_idx on posts (status, published_at desc); ``` **Urutan kolom penting.** Kolom yang dipakai untuk kesetaraan (`=`) ditaruh lebih dulu, diikuti kolom untuk pengurutan atau rentang. Index `(a, b)` bisa melayani filter pada `a` saja, tetapi tidak efektif untuk filter pada `b` saja. ## Langkah 3: partial index Jika Anda hanya sering membaca sebagian kecil baris, index parsial lebih hemat: ```sql create index posts_featured_idx on posts (published_at desc) where is_featured; ``` ## Langkah 4: full-text search Untuk pencarian teks, gunakan kolom `tsvector` dengan index **GIN**, bukan `ILIKE '%kata%'` yang tidak bisa memakai index B-tree biasa: ```sql create index posts_search_idx on posts using gin (search_vector); ``` ## Jebakan yang sering terjadi - **Terlalu banyak index.** Setiap index memperlambat `INSERT` dan `UPDATE` serta memakan ruang disk. - **Statistik usang.** Jalankan `ANALYZE` setelah perubahan data besar agar planner memilih rencana yang tepat. - **Fungsi pada kolom.** `where lower(email) = ...` tidak memakai index pada `email`. Buat index ekspresi: `create index on users (lower(email))`. ## Kesimpulan Ukur dengan `EXPLAIN ANALYZE`, buat index yang sesuai pola query nyata, lalu ukur lagi. Index terbaik adalah yang benar-benar dipakai oleh query Anda.
Bagikan:
A

Ditulis oleh

Azhar Banget