Darslik · 2026-07-20 · ~1 daqiqa o‘qiladi · o'rta
PostgreSQL indekslari: qachon kerak, qachon zarar
Mundarija
Indeks — bu jadval ustidagi "mundarija": qidiruvni tezlashtiradi, lekin har yozuvda (INSERT/UPDATE) uni yangilab turish kerak. Shuning uchun indeks — bepul emas, savdo.
Qachon kerak#
WHEREvaJOIN'larda tez-tez ishlatiladigan ustunlarORDER BY+LIMITkombinatsiyasi (masalan, oxirgi 20 ta yozuv)- Unikallik kafolati (
UNIQUEindeks)
Qachon zarar#
- Kichik jadvallar (Postgres baribir to‘liq o‘qishni tanlaydi)
- Kam qidirilib, ko‘p yoziladigan ustunlar — har INSERT sekinlashadi
- Selektivligi past ustunlar (masalan, ikki qiymatli
status)
Tekshirishning yagona to‘g‘ri yo‘li — EXPLAIN#
EXPLAIN ANALYZE
SELECT * FROM orders WHERE user_id = 42 ORDER BY created_at DESC LIMIT 20;
Seq Scan ko‘rsangiz va jadval katta bo‘lsa — indeks haqida o‘ylang:
CREATE INDEX orders_user_created_idx ON orders (user_id, created_at DESC);
Kompozit indeksda ustunlar tartibi muhim: avval tenglik bilan filtrlanadigani
(user_id), keyin saralanadigani (created_at).
Turlari haqida qisqacha#
| Tur | Qachon |
|---|---|
| B-tree (default) | Tenglik va diapazon: =, <, BETWEEN |
| GIN | JSONB, massivlar, full-text qidiruv |
| BRIN | Juda katta, tabiiy tartiblangan jadvallar (loglar) |
| Partial | Shartli: WHERE status = 'active' bo‘lgan so‘rovlargagina |
Amaliy tavsiya#
Indeksni taxmin bilan emas, o‘lchov bilan qo‘shing: sekin so‘rovni toping
(pg_stat_statements), EXPLAIN ANALYZE bilan tasdiqlang, indeks qo‘shib
qayta o‘lchang. Ishlatilmayotgan indekslarni pg_stat_user_indexes orqali
topib o‘chiring — ular joy va yozish tezligini yeb yotadi.