Index — ma’lumotlar bazasida recordlarni to‘liq table scan qilmasdan tez topishga yordam beradigan qo‘shimcha ma’lumotlar tuzilmasi. U bir yoki bir nechta column qiymatlari bilan table rowlari o‘rtasidagi qidiruv yo‘lini saqlaydi.
Index kitob oxiridagi mavzular ko‘rsatkichiga o‘xshaydi: kerakli ma’lumot qaysi joyda ekanini ko‘rsatadi. Buning evaziga qo‘shimcha storage va yozuv xarajati paydo bo‘ladi.
Index vazifasi
Quyidagi query katta table’da indexsiz barcha rowlarni tekshirishi mumkin:
SELECT *
FROM users
WHERE email = '[email protected]';
email uchun index mavjud bo‘lsa database kerakli entry’ni topib, tegishli rowga o‘tadi.
Index ayniqsa:
uchun ishlatiladi.
Index entry
Index odatda quyidagilarni saqlaydi:
- indexed key;
- row joylashuvi yoki primary key;
- tree yoki boshqa strukturadagi bog‘lanish;
- ayrim qo‘shimcha columnlar.
Index table data’sining nusxasi emas, query uchun optimallashtirilgan tuzilma.
B-tree index
Relational database’larda keng tarqalgan index turi B-tree oilasiga mansub.
U:
=;<;>;BETWEEN;- ordered scan;
- prefixga mos composite key
uchun qulay.
Tree balanslangan holda saqlanadi, shu sababli qidiruv balandlik bo‘yicha cheklangan bo‘ladi.
Hash index
Hash index exact equality lookup uchun mos.
key = value
Range va sort uchun odatda ishlatilmaydi.
Hash collision ichki mexanizm bilan boshqariladi.
Aniq imkoniyat va durability database implementationiga bog‘liq.
Composite index
Bir nechta column bitta indexga kiritiladi.
CREATE INDEX idx_orders_user_date
ON orders (user_id, created_at);
Column tartibi muhim.
Bu index:
user_id;user_idvacreated_at;- ayrim range querylar
uchun foydali bo‘lishi mumkin.
Faqat created_at bo‘yicha query undan to‘liq foydalana olmasligi ehtimoli bor.
Leftmost prefix
Composite B-tree index ko‘pincha chapdan boshlangan columnlar ketma-ketligi bo‘yicha samarali.
Index:
(a, b, c)
bo‘lsa:
a;a, b;a, b, c
filtrlari tabiiy mos keladi.
Faqat b yoki c bo‘yicha qidiruv boshqa index talab qilishi mumkin.
Unique index
Unique index indexed key takrorlanishini taqiqlaydi.
Masalan:
CREATE UNIQUE INDEX idx_users_email
ON users (email);
Bu parallel insertlar orasida ham uniquenessni database darajasida saqlaydi.
NULL qiymatlari qanday talqin qilinishi database qoidalariga bog‘liq.
Partial index
Faqat shartga mos rowlar indexlanadi.
CREATE INDEX idx_active_users
ON users (email)
WHERE deleted_at IS NULL;
Bu active rowlar uchun index hajmini kamaytiradi.
Query predicate’i index sharti bilan mos bo‘lishi kerak.
Expression index
Columnning o‘zi emas, ifoda natijasi indexlanadi.
CREATE INDEX idx_users_lower_email
ON users (LOWER(email));
Case-insensitive lookup shu ifodadan foydalansa index ishlashi mumkin.
Query ayni semantik ifodani qo‘llashi kerak.
Covering index
Queryga kerakli barcha columnlar index ichida mavjud bo‘lsa database table rowiga murojaat qilmasdan natija qaytarishi mumkin.
Bu index-only scan deb atalishi mumkin.
Qo‘shimcha include columnlar qidiruv tartibiga kirmasdan natijani qoplash uchun ishlatiladi.
Index kattalashgani sabab write va storage xarajati oshadi.
Selectivity
Indexning foydasi qiymatlar qanchalik farqli ekaniga bog‘liq.
Million rowdan faqat ikkita status qiymati mavjud bo‘lsa:
active
inactive
oddiy status indexi ko‘p row qaytaradigan queryda foydasiz bo‘lishi mumkin.
Optimizer statistics orqali selectivity’ni baholaydi.
Query optimizer
Database query plan tanlashda:
- index mavjudligi;
- statistics;
- row soni;
- selectivity;
- sort;
- join;
- data distribution
ni hisobga oladi.
Index mavjudligi uning albatta ishlatilishini anglatmaydi.
Kichik table’da sequential scan tezroq bo‘lishi mumkin.
Write xarajati
Har insert, update yoki delete tegishli indexlarni ham yangilaydi.
Ko‘p index:
- write latency;
- disk I/O;
- transaction log;
- vacuum yoki maintenance;
- storage
xarajatini oshiradi.
“Har column uchun index” samarali strategiya emas.
Index bloat
Update va delete natijasida indexda eskirgan yoki bo‘sh joylar to‘planishi mumkin.
Bu bloat:
- index hajmini;
- cache sarfini;
- scan vaqtini
oshiradi.
Database vacuum, rebuild yoki boshqa maintenance orqali joyni qayta ishlatadi.
Statistics
Optimizer index va table ma’lumotlarining taqsimoti haqida statistics saqlaydi.
Data keskin o‘zgarsa statistics eskiradi.
Natijada optimizer noto‘g‘ri row count bahosi va yomon query plan tanlashi mumkin.
Analyze yoki avtomatik statistics yangilanishi kerak.
Index va sort
ORDER BY index tartibi bilan mos bo‘lsa database alohida sort bosqichini bajarmasligi mumkin.
Ascending va descending tartib, NULL joylashuvi va collation mosligi muhim.
Filter va sort birga ishlatilsa composite index tartibi queryga mos tuziladi.
Full-text index
Oddiy B-tree matn ichidagi barcha so‘zlar bo‘yicha qidiruv uchun yetarli emas.
Full-text index:
- token;
- term;
- lexeme;
- ranking;
- language processing
bilan ishlaydi.
Prefix LIKE 'abc%' va LIKE '%abc%' bir xil index imkoniyatiga ega emas.
Index monitoring
Indexlar quyidagilar bo‘yicha kuzatiladi:
- scan soni;
- hajm;
- write xarajati;
- duplicate index;
- unused index;
- bloat;
- build vaqti.
Kam ishlatilgan indexni o‘chirishdan oldin mavsumiy yoki kam uchraydigan kritik querylar tekshiriladi.
Bog‘liq tushunchalar
Database index, B-tree, Hash index, Composite index, Unique index, Partial index, Query optimizer, Selectivity, Index scan, Covering index