MS Lesson8: DB index and partitions
Index
💻 Verilənlər Bazasında İndeks Nədir?
Verilənlər bazasında indeks — cədvəldəki məlumatları daha sürətli axtarıb tapmaq üçün yaradılan xüsusi bir məlumat strukturudur (adətən B-Tree adlanan ağac strukturunda saxlanılır).
Sən hər hansı bir sütuna (məsələn, email və ya username sütununa) indeks verəndə, verilənlər bazası arxa planda o sütundakı məlumatları sıralanmış şəkildə və əsl məlumatın yerini göstərən bir linklə (pointer) birlikdə yadda saxlayır.
🎯 Nə üçün lazımdır?
- Sürət (Əsas səbəb):
SELECTsorğularını (xüsusiləWHEREşərti ilə olanları) kəskin şəkildə sürətləndirir. Milyonlarla sətri olan cədvəldə axtarış saniyələr yox, millisaniyələr çəkir. - Sıralama (Sorting):
ORDER BYistifadə edəndə məlumatlar artıq indeksdə sıralanmış olduğu üçün baza əlavə güc sərf etmir. - Unikallıq (Uniqueness):
UNIQUE INDEXyaradaraq bir sütunda eyni məlumatın (məsələn, eyni emailin) iki dəfə qeydiyyatdan keçməsinin qarşısını ala bilərsən.
⚠️ Bəs pis tərəfi (Trade-off) nədir?
Hər şeyə indeks vermək olmaz! Niyə?
- Yer tutur: İndekslər arxa planda əlavə fayllar yaradır və diskdə yer tutur.
- Yazma sürətini azaldır: Cədvələ yeni məlumat əlavə edəndə (
INSERT), siləndə (DELETE) və ya dəyişdirəndə (UPDATE), verilənlər bazası həm də indeksi yeniləməlidir. Bu isə yazma əməliyyatlarını yavaşladır.
B-Tree
Non-Clustered index
Təsəvvür edək ki, universitetin bazasında Student (Tələbə) adlı bir cədvəlimiz var. Cədvəldə minlərlə tələbə var, amma biz nümunə üçün 8 tələbə üzərindən gedəcəyik.
1. İndeks Olmadan Həyat (Full Table Scan)
Tələbələr bazaya qeydiyyatdan keçdikcə, məlumatlar sərt diskə (Hard Drive/SSD) ardıcıl, lakin qarışıq (sırasız) şəkildə yazılır. Verilənlər bazası hər bir sətrə gizli bir fiziki ünvan verir. Buna Row ID (və ya Pointer) deyilir.
📦 ƏSAS CƏDVƏL (Diskdəki real vəziyyət):
| Row ID (Gizli) | ID | Name | Surname | Age |
|---|---|---|---|---|
0x001 | 1 | Zaur | Əliyev | 20 |
0x002 | 2 | Aysel | Məmmədova | 22 |
0x003 | 3 | Tural | Həsənov | 21 |
0x004 | 4 | Leyla | Quliyeva | 19 |
0x005 | 5 | Cavid | Rzayev | 23 |
0x006 | 6 | Nərmin | Abbasova | 20 |
0x007 | 7 | Fidan | Kərimova | 21 |
0x008 | 8 | Elnur | Qasımov | 22 |
Problem: Əgər biz SELECT * FROM Student WHERE Name = 'Nərmin' yazsaq, baza 1-ci sətirdən başlayıb 6-cı sətrə qədər hər şeyi tək-tək oxumalıdır. Milyonlarla sətir olsaydı, bu, serveri donduracaqdı.
2. İndeks Yaradırıq (Sehrin Başlanğıcı)
Biz qərar veririk ki, Name sütununda axtarışları sürətləndirək və bu komandanı yazırıq:
Bu zaman nə baş verir? Əsas cədvəl olduğu kimi qalır. Baza gedir, diskdə tamamilə yeni, müstəqil bir fayl yaradır. Lakin bu fayl sadə bir siyahı deyil, xüsusi bir həndəsi fiqur — B-Tree (Balanced Tree - Balanslı Ağac) formasında qurulur.
3. B-Tree (Balanslı Ağac) Nədir və Necə Qurulur?
B-Tree məlumatları elə qruplaşdırır ki, sən axtardığın sözü tapmaq üçün bütün siyahını oxumağa məcbur qalmayasan. Hər addımda ehtimalların yarısını kəsib atırsan.
B-Tree 3 hissədən ibarətdir:
- Root Node (Kök düyün): Axtarışın başladığı ən üst nöqtə.
- Branch/Internal Nodes (Budaqlar): Bizi düzgün istiqamətə yönləndirən yolayrıcıları.
- Leaf Nodes (Yarpaqlar): Ən alt təbəqə. Əsl adlar və Pointer-lər (Row ID) məhz buradadır!
Gəlin yuxarıdakı 8 adı əlifba sırasına görə B-Tree strukturuna yerləşdirək: (Aysel, Cavid, Elnur, Fidan, Leyla, Nərmin, Tural, Zaur)
🌳 B-Tree-nin Vizual Təsviri:
(Qeyd: Ağacın strukturu bazanın daxili alqoritminə görə fərqli qruplaşa bilər, lakin məntiq tam olaraq budur).
Gördüyünüz kimi, Yarpaq (Leaf) səviyyəsində yalnız iki məlumat var:
- Tələbənin Adı (Sıralanmış)
- Həmin tələbənin Əsas Cədvəldəki ünvanı (Pointer / Row ID).
4. Axtarışın Addım-Addım İcrası (Query Execution)
İndi tələbə bazaya bu sorğunu göndərir:
Baza əsas cədvələ baxmır! Birbaşa B-Tree (İndeks) faylına daxil olur və bu addımları atır:
Addım 1: Kökə (Root) daxil olur. Baza soruşur: "Nərmin" sözü "M" hərfindən əvvəl gəlir, yoxsa sonra? Cavab: N hərfi M-dən sonradır. Baza sol tərəfi (Aysel, Cavid və s.) tamamilə unudur. Axtarış sahəsi 50% azaldı! Sağ budağa gedir.
Addım 2: Budağa (Branch) çatır. Burada "T" hərfi var. Baza soruşur: "Nərmin" sözü "T" hərfindən əvvəldir, yoxsa sonra? Cavab: N hərfi T-dən əvvəldir. Baza sağ tərəfi (Tural, Zaur) unudur. Sol yarpağa düşür.
Addım 3: Yarpağı (Leaf) tapır. Baza sol yarpağa baxır və "Nərmin" adını dərhal görür. Nərminin yanında nə yazılıb? Pointer: 0x006.
Addım 4: Pointer ilə Əsas Cədvələ Sıçrayış (Key Lookup) Baza artıq bilir ki, Nərminin qalan məlumatları diskdə 0x006 ünvanındadır. B-Tree-dən çıxır, birbaşa Əsas Cədvəldəki 0x006 sətrinə gedir.
Addım 5: Nəticənin qaytarılması Əsas cədvəldən 0x006 sətrindəki Surname (Abbasova) və Age (20) məlumatlarını götürüb istifadəçiyə qaytarır. Bütün bu proses millisaniyələr çəkir!
Clustered index
🚀 Primary Key (ID) ilə Axtarışın Sirri: Clustered Index
Bayaq biz Name sütununa indeks yaratdıq. Bu indeks növünə Non-Clustered Index (Klasterləşməmiş İndeks) deyilir. Onun xüsusiyyəti o idi ki, İndeks faylı ayrı, Əsas Cədvəl ayrı yerdə idi və aralarında Pointer (Row ID) ilə körpü qurulurdu.
Amma sən cədvəl yaradanda ID sütununu Primary Key (Əsas Açar) kimi təyin edirsən:
Sən PRIMARY KEY yazan kimi verilənlər bazası arxa planda çox radikal bir qərar verir. O, sadəcə yeni bir indeks faylı yaratmır, o, Əsas Cədvəlin özünün fiziki strukturunu dəyişdirir! Buna Clustered Index (Klasterləşmiş İndeks) deyilir.
. Clustered Index Nədir? (Cədvəlin Özü B-Tree Olur!)
Bayaq dedik ki, məlumatlar diskə qarışıq, sırasız şəkildə yazılır. Amma cədvəldə Primary Key (Clustered Index) varsa, baza buna icazə vermir.
Baza deyir: "Mən artıq məlumatları diskə qarışıq yazmayacam. Bütün cədvəli ID-yə görə sıralayıb, elə cədvəlin özünü nəhəng bir B-Tree strukturuna çevirəcəyəm!"
Fərq buradadır: Non-Clustered Index-də (Məsələn, Name üzrə) B-Tree-nin ən alt yarpaqlarında (Leaf Nodes) yalnız Ad və Pointer var idi. Clustered Index-də (Məsələn, ID üzrə) isə B-Tree-nin ən alt yarpaqlarında BÜTÜN SƏTİR (Data-nın özü) yerləşir! Burada Pointer-ə ehtiyac yoxdur, çünki məlumat elə oradadır.
2. Clustered Index-in Vizual Təsviri
Gəlin ID-yə görə qurulmuş cədvəlin B-Tree strukturuna baxaq:
Gördüyünüz kimi, yarpaqlarda sadəcə ID və Pointer yoxdur. Bütün cədvəl məlumatı (Ad, Soyad, Yaş) elə bu ağacın yarpaqlarına hörülüb. Cədvəl fiziki olaraq diskdə bu ardıcıllıqla saxlanılır.
3. Axtarışın Addım-Addım İcrası (ID ilə axtarış)
İndi tələbə bazaya belə bir sorğu göndərir:
Baza bu əməliyyatı necə icra edir?
Addım 1: Kökə (Root) daxil olur. Baza soruşur: "Axtardığım ID (6) Kökdəki 5-dən böyükdür, yoxsa kiçik?" Cavab: Böyükdür. Baza sol tərəfi (1,2,3,4) tamamilə unudur. Sağ budağa gedir.
Addım 2: Budağa (Branch) çatır. Burada ID: 7 var. Baza soruşur: "Axtardığım ID (6) 7-dən kiçikdir, yoxsa böyük?" Cavab: Kiçikdir. Baza sağ tərəfi (7,8) unudur. Sol yarpağa düşür.
Addım 3: Yarpağı (Leaf) tapır və Məlumatı Götürür! Baza yarpağa düşən kimi ID = 6 olan sətri tapır. Bayaq Name ilə axtaranda burada Pointer tapıb başqa yerə (Əsas cədvələ) tullanmalı olurduq. Amma indi? İndi heç yerə tullanmağa ehtiyac yoxdur! Çünki cədvəlin özü buradadır. Baza elə həmin sətirdən Surname (Abbasova) və Age (20) məlumatlarını götürüb dərhal istifadəçiyə qaytarır.
Clustered index vs non clustered index
1. Clustered Index (Klasterləşmiş İndeks) = Lüğətin Özü
Təsəvvür et ki, əlində qalın bir İngiliscə-Azərbaycanca lüğət var.
Bu lüğətdə sözlər necə düzülüb? A-dan Z-yə doğru sıralanıb. "Apple" sözü əvvəldədir, "Zebra" sözü ən axırdadır.
Əgər sən "Monkey" sözünü axtarırsansa, nə edirsən? Kitabın ortasını açırsan, "M" hərfinə gedirsən, "Monkey" sözünü tapırsan. Və ən əsası: Sözün tərcüməsi (mənası) elə həmin yerdə, sözün yanındadır! Başqa heç yerə getməyə ehtiyac yoxdur.
Verilənlər bazasında bu necə işləyir?
- Clustered Index cədvəlin özünü fiziki olaraq sıralayır (necə ki, lüğət sözləri sıralayır).
- Məlumatın özü (ad, soyad, yaş) elə axtardığın şeyin (məsələn, ID-nin) yanındadır.
- Bir cədvəldə yalnız 1 dənə Clustered Index ola bilər. Niyə? Çünki bir kitabı eyni anda həm A-dan Z-yə, həm də Z-dən A-ya fiziki olaraq sıralaya bilməzsən. Bir əşyanın yalnız bir fiziki sırası ola bilər.
- Adətən
Primary Key(məsələn,ID) avtomatik olaraq Clustered Index olur.
2. Non-Clustered Index (Klasterləşməmiş İndeks) = Kitabın arxasındakı Mündəricat (İndeks)
İndi təsəvvür et ki, sənə tarix kitabı veriblər. Kitabın içindəki mövzular xronoloji ardıcıllıqla (illərə görə) düzülüb. (Bu, kitabın Clustered Index-idir).
Amma sən bu kitabda "Şah İsmayıl Xətai" adını tapmaq istəyirsən. Kitab illərə görə düzüldüyü üçün adı tapmaq çətindir. Nə edirsən? Kitabın ən arxasına — İndeks (Göstəricilər) bölməsinə baxırsan.
Orada adlar əlifba sırası ilə düzülüb:
- Nizami Gəncəvi ... səh 120
- Şah İsmayıl Xətai ... səh 250
Sən "Şah İsmayıl Xətai" adını tapırsan, amma onun haqqındakı məlumat orada deyil! Orada yalnız bir göstərici (səhifə nömrəsi) var. Məlumatı oxumaq üçün sən o səhifə nömrəsini (250) yadda saxlayıb, kitabın əsas hissəsinə (250-ci səhifəyə) getməlisən.
Verilənlər bazasında bu necə işləyir?
- Non-Clustered Index cədvəlin fiziki sırasına dəymir. O, cədvəldən kənarda, ayrı bir siyahı yaradır (kitabın arxasındakı mündəricat kimi).
- Bu siyahıda yalnız sənin axtardığın sütun (məsələn,
Name) və onun əsas cədvəldəki ünvanı (Pointer / Səhifə nömrəsi) olur. - Axtarış edəndə sən əvvəlcə bu ayrı siyahıda adı tapırsan, sonra oradakı ünvanla gedib əsas cədvəldən qalan məlumatları götürürsən. (Buna görə Clustered-dən bir az yavaşdır).
- Bir cədvəldə çoxlu Non-Clustered Index yarada bilərsən. (Kitabın arxasında həm şəxs adları, həm də şəhər adları üçün ayrı-ayrı indekslər ola bilər).
Комментарии
Отправить комментарий