Composite index — database jadvalidagi ikki yoki undan ortiq ustun qiymatlarini bitta tartiblangan indeks kalitida birlashtiradigan indeksdir. U bir nechta ustun bo‘yicha filter, join yoki sorting bajariladigan querylarni tezlashtiradi. Ustunlar tartibi indeksning qaysi so‘rovlarga foyda berishini belgilaydi.
Kalit tartibi
(customer_id, created_at) indeksi avval customer_id, uning ichida created_at bo‘yicha tartiblanadi. B-tree uchun leftmost prefix qoidasi muhim: indeks faqat customer_id bo‘yicha ham ishlashi mumkin, ammo faqat created_at bo‘yicha qidiruvda odatda samarali boshlanish nuqtasi bermaydi.
CREATE INDEX orders_customer_created_idx
ON orders (customer_id, created_at DESC);
Quyidagi query bitta mijozning so‘nggi buyurtmalarini indeks tartibida topadi:
SELECT id, total
FROM orders
WHERE customer_id = 42
ORDER BY created_at DESC
LIMIT 20;
Equality va range
Composite indeksda equality shartlari ko‘pincha oldin, range sharti keyin joylashtiriladi. (tenant_id, status, created_at) indeksi tenant_id = ? AND status = ? AND created_at >= ? so‘roviga mos. Birinchi range ustunidan keyingi kalitlar scan oralig‘ini toraytirishda cheklangan ishlashi mumkin.
Bu qat’iy universal qoida emas. Ustun selectivitysi, sorting, index-only scan va database optimizerining skip-scan kabi imkoniyatlari ham hisobga olinadi. Real query plan EXPLAIN orqali tekshiriladi.
Sorting
Indeks ustunlarining ASC yoki DESC yo‘nalishi aralash sortingga ta’sir qiladi. Ko‘p B-tree indeksni to‘liq teskari yo‘nalishda o‘qiy oladi, lekin a ASC, b DESC kabi tartib uchun aynan mos definitsiya kerak bo‘lishi mumkin. NULLS FIRST yoki NULLS LAST ham query va engine xususiyatiga bog‘liq.
Filterdan keyin ko‘p satr qolsa, indeks tartibi alohida sort operationni yo‘qotadi. LIMIT bilan bu ayniqsa foydali: engine kerakli birinchi satrlarni topgach to‘xtaydi.
Covering xususiyati
Query qaytaradigan barcha ustunlar indeksda bo‘lsa table heapga murojaat qilmasdan index-only scan mumkin. Kalit bo‘lmagan ustunlar ayrim databaselarda INCLUDE bilan leaf qismiga qo‘shiladi. Ular search tartibida qatnashmaydi, lekin queryni qoplaydi.
Indeksga ortiqcha ustun qo‘shish uning hajmini va write xarajatini oshiradi. Katta matn yoki tez-tez o‘zgaradigan field leaf page split, cache bosimi va WAL hajmini ko‘paytirishi mumkin.
Selectivity va takroriy indekslar
Birinchi ustun juda kam noyob qiymatga ega bo‘lsa, faqat shu prefix bo‘yicha scan ko‘p satr o‘qiydi. Tenant ID kabi ustun global darajada takroriy bo‘lsa ham har query tenant bilan cheklansa yaxshi prefix bo‘lishi mumkin. Selectivity workload kontekstida baholanadi.
(a, b) indeksi mavjud bo‘lsa alohida (a) indeks ba’zan ortiqcha bo‘ladi. Ammo kichik indeks cachega sig‘ishi, unique constraint yoki boshqa operator class talab qilishi mumkin. Foydalanish statistikasi va write narxi tekshirilmasdan indeks olib tashlanmaydi.
Maintenance
Har insert, delete va indexed column update composite indeksni ham yangilaydi. Ko‘p indeks write throughputni pasaytiradi. Column tartibi update chastotasini o‘zgartirmaydi, ammo keng kalit storage va tree depthga ta’sir qiladi.
Statistika eski bo‘lsa optimizer foydali indeksni tanlamasligi mumkin. Correlated ustunlarda alohida statistika noto‘g‘ri cardinality taxmini beradi; extended statistics birgalikdagi taqsimotni ifodalashi mumkin.
Partition bilan ishlashi
Partitioned table’da indeks ko‘pincha har partition uchun alohida fizik tuzilma sifatida yaratiladi. Global noyoblik yoki global index imkoniyati databasega bog‘liq. Query partition keyni filter qilmasa bir nechta lokal indeks scan qilinishi mumkin. Composite kalitga partition keyni qo‘shish pruning va uniqueness talabiga yordam beradi, biroq faqat constraintni qondirish uchun keraksiz keng kalit yaratishdan oldin platforma semantikasi tekshiriladi.
Bog‘liq tushunchalar
Database index, B-tree, Covering index, Selectivity, Index scan, Query optimizer, Extended statistics