Deməli, PostgreSQL dünyasında bir neçə indeks növü var və hər biri özünəməxsus rol üçün yaradılıb. Bu, nəqliyyat vasitəsi seçmək kimidir: parkda gəzmək üçün velosiped götürərsən, amma şəhərin o biri başına getmək üçün yəqin ki, maşın seçərsən. Eyni qayda ilə, fərqli indekslər fərqli işlər üçün uyğundur.
PostgreSQL-də əsas indeks növlərinə daxildir:
B-TREEindeksləri: əksər işlər üçün universal indekslər.HASHindeksləri: dəqiq müqayisə üçün optimallaşdırılıb.GINindeksləri: massivlər və JSONB üçün idealdır.GiSTindeksləri: coğrafi kimi mürəkkəb məlumat tipləri üçün istifadə olunur.
İndekslər sətirlərin axtarışını sürətləndirmək üçün yaradılıb. Onların 4 fərqli optimizasiya tipi var: hər biri müəyyən əməliyyatları sürətləndirir və müəyyən məlumat tipləri ilə daha yaxşı işləyir.
İndekslərə birbaşa nəzarət edə bilmirsən. Sadəcə indeks tipini seçirsən: heç biri və ya yuxarıda sadalananlardan biri. İndi hər birinə baxaq ki, nə vaxt və necə istifadə etmək lazımdır, başa düşək.
B-TREE indeksləri
B-TREE ("balanced tree" sözünün qısaltması) — ən çox istifadə olunan indeks növüdür, PostgreSQL-in əsasını təşkil edir. Bu indeks ağacvari struktur yaradır, məlumatlar elə təşkil olunur ki, axtarış, sıralama və filtrasiya sürətlənir.
Təsəvvür elə, kitabxanada rəflər var və hər rəfdə kitablar əlifba sırası ilə düzülüb. "M" hərfi ilə başlayan kitabı axtarırsansa, bütün kitabları bir-bir yoxlamağa ehtiyac yoxdur — ortadan başlamaq kifayətdir. Balanslaşdırılmış ağaclar da bu prinsiplə işləyir.
Bəs bunları nə vaxt istifadə etməli?
Demək olar ki, həmişə! B-TREE indeksləri xüsusilə aşağıdakılar üçün faydalıdır:
- Aralıq üzrə axtarış:
WHERE price > 100. - Sıralama:
ORDER BY name ASC. - Bərabərlik üzrə axtarış:
WHERE id = 42.
Yaradılma nümunəsi:
-- products cədvəlində price sütunu üçün B-TREE indeksi yaradırıq:
CREATE INDEX idx_price ON products(price);
Sorğuda WHERE price > 100 kimi bir şey yazanda, PostgreSQL bu indeksə baxacaq və bütün cədvəli skan etməyəcək.
HASH indeksləri
HASH indeksləri sürətli axtarış üçün hash-cədvəllərdən istifadə edir. Onların güclü tərəfi dəqiq dəyərlərin müqayisəsidir. Amma HASH indekslərinin bir məhdudiyyəti var: aralıq üzrə axtarış və ya sıralamanı dəstəkləmir.
Bu, hər kartın öz nömrəsi olan kartoteka kimidir. 42 nömrəli kartı axtarırsan, kitabxanaçı onu dərhal tapır. Amma desən ki, "40-dan 50-yə qədər kartları göstər", imtina edəcəklər.
HASH indeksləri yalnız dəqiq axtarış üçün uyğundur:
WHERE email = 'user@example.com'.SELECT ... WHERE id = 123.
Əgər sənə aralıq və ya sıralama lazımdırsa, HASH uyğun deyil.
Yaradılma nümunəsi:
-- users cədvəlində email sütunu üçün hash-indeks yaradırıq:
CREATE INDEX idx_email_hash ON users USING HASH (email);
İndi PostgreSQL bu indeksi WHERE email = 'user@example.com' tipli sorğular üçün istifadə edəcək.
Diqqət yetir: HASH indeksləri xüsusi hallarda uyğundur və B-TREE-dən daha az istifadə olunur.
GIN (Generalized Inverted Index) indeksləri
GIN — massivlər, JSONB və mətn məlumatları ilə əsl sehr yaradan xüsusi indeksdir. Təsəvvür elə, minlərlə siyirməsi olan bir şkaf var və hər siyirmənin üstündə yazı var. Məsələn, "alma" siyirməsində bütün almalar, "banan" siyirməsində isə bananlar var. Alma və ya banan tapmaq üçün bütün siyirmələri axtarmağa ehtiyac yoxdur — birbaşa lazımi siyirməyə gedirsən.
GIN indeksləri bunlar üçün lazımdır:
- Massivlər üzrə axtarış:
@>(özündə saxlayır),<@(özündə saxlanılır). - JSONB məlumatları:
WHERE jsonb_data @> '{"key": "value"}'.
Yaradılma nümunəsi
-- tags sütununda massivlər olan products cədvəli üçün GIN-indeks yaradırıq:
CREATE INDEX idx_tags_gin ON products USING GIN (tags);
İndi PostgreSQL məhsulları effektiv şəkildə tapa biləcək, məsələn, tag-ları "elektronika" və "tövsiyə olunan" olanları.
GiST (Generalized Search Tree) indeksləri
GiST indeksləri — daha mürəkkəb məlumat tipləri, o cümlədən coğrafi koordinatlar və aralıqlar üçün güclü alətdir. Onlar məkan axtarışı və aralıq üzrə axtarış üçün optimallaşdırılmış ağaclar qurur.
Təsəvvür elə, şəhər xəritəsi var və hər nöqtə koordinatına görə işarələnib. Cari nöqtədən 5 km radiusda olan bütün nöqtələri tez tapa bilərsən.
GiST bunlar üçün uyğundur:
- Coğrafi məlumatlar:
SELECT ... FROM locations WHERE ST_DWithin(geom, point, distance). - Aralıq üzrə axtarış:
WHERE date_range && '[2023-01-01, 2023-12-31]'.
Nümunə:
-- places cədvəlində coğrafi məlumatlar olan location sütunu üçün GiST-indeks yaradırıq:
CREATE INDEX idx_location_gist ON places USING GiST (location);
İndi yaxın nöqtələrin axtarışı kimi mürəkkəb coğrafi sorğuları yerinə yetirmək olar.
İndekslərin müqayisə cədvəli
| İndeks tipi | Nə üçün uyğundur... | İstifadə nümunələri | Qeydlər |
|---|---|---|---|
B-TREE |
Aralıq üzrə axtarış, sıralama | price > 100, ORDER BY name ASC |
Universal indeks. |
HASH |
Dəqiq bərabərlik yoxlaması | email = 'user@example.com', id = 42 |
Aralıqları dəstəkləmir. |
GIN |
Massivlər, JSONB | tags @> '{tech}', jsonb_data @> '{"key": "value"}' |
Mürəkkəb məlumatlar üçün daha sürətlidir. |
GiST |
Coğrafiya, aralıqlar, məsafələr | ST_DWithin(geom, point, distance) |
Geo-məlumatlar üçün istifadə olunur. |
Artıq PostgreSQL-də əsas indeks tipləri və onların tətbiqi ilə tanışsan. Yadda saxla: indeks seçimi — sorğularının sürətindən asılı olan strateji addımdır. Şah və mat, ləngimələr!
GO TO FULL VERSION