INDEX: indekslar

All lectures for UZ purposes
Daraja, Dars
Mavjud

7.1 Indekslarning paydo bo‘lish sabablari

Bazalarisiz imkoniyatsiz bo‘lgan yana bir muhim narsa — bu indekslardir.

user jadvalida 10 million foydalanuvchi borligini va senga level 90 dan yuqori bo'lganni chiqarish kerak deb tasavvur qiling. Bu so‘rovni yozish juda oson:


SELECT * FROM user WHERE level > 90
        

Ajoyib, biz so‘rovni bir daqiqadan kamroq vaqtda yozib oldik. SQL-server bu so‘rovni bajarishi uchun qancha vaqt kerak bo‘ladi? Bunday so‘rovni bajarish uchun u 10 million yozuvni ko‘rib chiqishi kerak, va agar kerakli yozuv faqatgina bitta bo‘lsa ham, bu juda ko‘p vaqtni oladi.

Java-da biz shunga o‘xshash vazifani qanday qilayotgan bo‘lar edik? Dastlab biz userlar kolleksiyasini level bo‘yicha tartiblab, keyin binary search orqali kerakli yozuvlarni topishimiz juda tez bo‘lar edi. Bu nima ekanligini tushuntirishning hojati yo'q, deb umid qilaman?

Ajoyib, endi agar bizga foydalanuvchilarni 2020 yildan oldin ro‘yxatga olingan sanasi bilan tanlash kerak bo‘lsa, nima qilamiz? Yana ro‘yxatga olingan sanasi bo‘yicha tartiblab binary searchdan foydalanamiz.

Aytmoqchimanki, agar biz biror maydon bo‘yicha filtrni bir necha marta emas, balki tez-tez bajaradigan bo‘lsak, ma’lumotlarni ushbu maydon bo‘yicha tartiblash maqsadga muvofiq bo‘ladi.

Ma’lumotlarni bir vaqtning o‘zida turli maydonlar bo‘yicha qanday saqlash kerak?

Javob juda oddiy — o‘zbek qayta ma’lumotlarni emas, balki ularning indekslarini global jadvalda saqlash kerak.

Faraz qilaylik, id: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} bo‘lgan 10 ta foydalanuvchi bor.

Va sen ularni level bo‘yicha tartiblashga qaror qilsang, idlar massivi, masalan, quyidagicha bo‘ladi: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

Agar ularni sanasi bo‘yicha tartiblasak, taxminan quyidagicha olamiz: {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Bu idlarning massivi indekslar deb ataladi. O‘zbek yirik elementlarni, ular o‘z joyidan harakatlanmaydi. Java-da biz ob’ektlarni o‘zbek surishmaymiz, faqat ularning manzillarini saqlaymiz, SQL-da biz haqiqiy satrlarni surishmaymiz, faqat ularning raqamlarini saqlaymiz.

Keling, men buni Java-kod sifatida qayta yozib ko‘ray:


List<String> list = List.of("А", "С", "B", "Z", "Сc", "Bb", "Zz", "Y");  //bu ob’ektlarning ro‘yxati
List<String> alphabeticsList = new ArrayList(list);
Collections.sort(alphabeticsList); //kollektsiya alifbo tartibida tartiblangan
 
List<String> lengthList = new ArrayList(list);
Collections.sort(lengthList, lengthComparator); //kollektsiya satr uzunligi bo‘yicha tartiblangan

Kollektsiyalarni saralash haqiqiy elementlarni ko‘chirishni anglatmaydi. Kollektsiya haqiqiy ob’ektlarni saqlamaydi, balki ularning manzillarini saqlaydi. Xuddi shunday SQL jadvallarida ham. Haqiqiy satrlar o‘z o‘rnida turaveradi.

Va agar biz biror maydon bo‘yicha tez-tez tanlov qilishimiz kerak bo‘lsa, biz jadvalga yana bir indeks qo‘shamiz (Java-da yangi kolleksiya kabi) va jadvallarni tartiblab, ularning tartibli tartibini maxsus indeks faylida saqlaymiz.

Umid qilamanki, Java bilan solishtirish biroz yordam berdi. Biroz amaliyot — va sen uchun indekslardan foydalanish ham eng aniq yechim bo‘ladi.

7.2 Jadvalga indeks qo‘shish

Indeksni jadval yaratish vaqtida yoki keyinroq qo‘shish mumkin. Eng ko‘p uchraydigan holat — indekslarni jadval hajmi o‘sib borishi va ma’lumotlarni tanlash sekinlashishi bilan qo‘shishadi.

Jadvarga indeks qo'shish juda oson:


ALTER TABLE jadval
    ADD INDEX indeks_nomi (kolonka);
        

Agar bir vaqtning o‘zida bir necha kolonka bo‘yicha tanlashni tez-tez bajarsang, bir necha kolonka foydalanib bo‘ladigan kompleks indeksni ko‘rsata olasan.

Jadvarga kompleks indeks qo'shish ham juda oson:


ALTER TABLE jadval
    ADD INDEX indeks_nomi (kolonka1, kolonka2, kolonka3, ...);
        

Indekslar diskda yetarlicha ko‘p joy egallaydi, shuning uchun endi senga kerak bo‘lmagan indeksni yo'q qilishing mumkin:


ALTER TABLE jadval
    DROP INDEX indeks_nomi;
        

Indekslarning o‘zi bazaning yetarlicha yashirin qismidir. Ular so‘rovlarning yozilishi formatiga hech qanday ta’sir qilmaydi. Faqatgina ularning mavjudligi ma'lumotlarni tanlashni tezlashtiradi va ularni qo'shishni va zaxira qilishni sekinlashtiradi.

Lekin zamonaviy dunyoda tezlik naqadar muhim ekanligini va diskdagi joy naqadar arzon ekanligini inobatga olib, har xil vaziyatlar uchun indeks qo‘shishdan tortinma. Adminlar meni kechirsin...

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION