Verilənlər bazasında indeksləşdirmə: sorğularınızı necə sürətləndirir
«Verilənlər bazamız niyə yavaşdır?» problemlərinin böyük hissəsi bir çatışmayan şeyə gəlib çıxır: indeksə. Bu, verilənlər bazaları haqqında anlaya biləcəyiniz ən təsirli mövzulardan biridir və əksər izahların təqdim etdiyindən daha sadədir.
Kitabxana bənzətməsi
Nə kataloqu, nə də hər hansı təşkil sistemi olan kitabxana təsəvvür edin — hər kitab sadəcə rəfdə boş yer olan yerə qoyulub. Konkret bir kitabı tapmaq üçün rəflərin arasında gəzib hər birini yoxlamalısınız. İndeksi olmayan verilənlər bazası cədvəli məhz belədir: sətri tapmaq üçün verilənlər bazası axtardığını tapana qədər hər sətri bir-bir yoxlayır. Buna cədvəlin tam skan edilməsi (full table scan) deyilir; kiçik cədvəldə bu, problem deyil, milyonlarla sətri olan cədvəldə isə dəhşətli dərəcədə yavaşdır.
İndeks həmin kataloqdur. Bu, «bu sütunun bu dəyərə bərabər olduğu sətirləri dəqiq burada tapa bilərsiniz» deyən ayrıca, nizamlı strukturdur, beləliklə, verilənlər bazası hər şeyi yoxlamaq əvəzinə birbaşa ora keçə bilir.
Daxildə əslində necə işləyir
Əksər verilənlər bazaları indeksləri B-ağac (B-tree) adlanan verilən strukturu ilə reallaşdırır — dəyərləri nizamlı saxlayan və hər addımda qalan variantları təxminən yarıya endirərək axtarışı daraltmağa imkan verən balanslaşdırılmış ağac; bu, çap olunmuş lüğətdə sözü necə axtarmağınıza bənzəyir. Milyon sətri bir-bir yoxlamaq əvəzinə verilənlər bazası cəmi on-on iki ağac düyününü yoxlayıb birbaşa cavaba çata bilər.
Məhz buna görə düzgün indeks əlavə etmək bir neçə saniyə çəkən sorğunu bir neçə millisaniyəlik sorğuya çevirə bilər — siz verilənlər bazasını daha çox işlətmirsiniz, ona eyni cavaba gedən daha qısa yol verirsiniz.
Əslində nəyi indeksləşdirmək lazımdır
WHEREifadələrində istifadə olunan sütunlar — tez-tez filtrlədiyiniz istənilən şey indeks üçün güclü namizəddir.- Xarici açarlar — başqa cədvələ istinad edən sütunlar, çünki birləşmələr (join) onlara böyük ölçüdə əsaslanır.
ORDER BY-da istifadə olunan sütunlar — verilənləri artıq düzgün ardıcıllıqla saxlayan indeks çeşidləmə mərhələsini tamamilə ötürə bilər.JOINşərtlərindəki sütunlar — birləşmə sütunlarında indeks olmadan böyük cədvəlləri birləşdirmək yavaş sorğuların ən geniş yayılmış səbəblərindən biridir.
Problem yaradana qədər heç kimin danışmadığı kompromis
İndekslər pulsuz deyil. Hər dəfə sətir əlavə etdikdə, yenilədikdə və ya sildikdə hər indeks yenilənməlidir, yəni indeks əlavə etdikcə yazma əməliyyatları yavaşlayır. Onlar həm də real disk sahəsi tutur və bu, miqyasda əhəmiyyət kəsb edir. Qaçınılmalı olan səhv mücərrəd şəkildə «indeks azdır» və ya «indeks çoxdur» deyil — demək olar ki, heç vaxt sorğulanmayan sütunları indeksləşdirməkdir: bu, heç vaxt real faydasını görməyəcəyiniz bir şey üçün hər yazma əməliyyatını yavaşladır.
Yaxşı praktik qayda: real sorğularınızın filtrlədiyi, birləşdirdiyi və çeşidlədiyi sütunları indeksləşdirin — varsa, yavaş sorğular jurnalını yoxlayın — və hər şeyi «nə olar, olmaz» deyə indeksləşdirmək istəyinə qapılmayın.
Canlı mühitdə işləyən real verilənlər bazasına hansı indekslərin həqiqətən lazım olduğunu — və hansılarının hər yazma əməliyyatında səssizcə sizə baha başa gəldiyini — dəqiq müəyyən etmək gördüyümüz infrastruktur işlərinin adi hissəsidir və real trafik altında ləngiməyə başlamış sistem üçün çox vaxt ən təsirli dəyişiklik məhz budur.