CodeGym /Kurslar /SQL SELF /Əsas indeks növləri: B-TREE, HASH

Əsas indeks növləri: B-TREE, HASH, GIN, GiST

SQL SELF
Səviyyə , Dərs
Mövcuddur

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-TREE indeksləri: əksər işlər üçün universal indekslər.
  • HASH indeksləri: dəqiq müqayisə üçün optimallaşdırılıb.
  • GIN indeksləri: massivlər və JSONB üçün idealdır.
  • GiST indekslə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!

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION