Asosiy kontentga o‘tish

Maqolalar

Darslik · 2026-07-20 · ~1 daqiqa o‘qiladi · o'rta

PostgreSQL indekslari: qachon kerak, qachon zarar

#postgresql #backend #performance

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#

  • WHERE va JOIN'larda tez-tez ishlatiladigan ustunlar
  • ORDER BY + LIMIT kombinatsiyasi (masalan, oxirgi 20 ta yozuv)
  • Unikallik kafolati (UNIQUE indeks)

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.