Panduan Index PostgreSQL: Dari EXPLAIN ANALYZE hingga Composite Index
Kapan membuat index, bagaimana urutan kolom memengaruhi performa, dan cara membuktikannya dengan EXPLAIN ANALYZE.
A
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.
A
Ditulis oleh