CodeGym /Kurslar /SQL SELF /İndekslərin yaradılması (`CREATE INDEX`) və indeksasiya p...

İndekslərin yaradılması (`CREATE INDEX`) və indeksasiya parametrləri (`UNIQUE`, `CONCURRENTLY`)

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

Artıq bir neçə dəfə danışmışıq ki, indekslər select-ləri sürətləndirir və bazanın hər şeyi başdan-ayağa axtarmasına ehtiyac qalmır. İndi isə gəlin baxaq, indekslər konkret necə yaradılır, CREATE INDEX komandasında hansı parametrlər var və nə vaxt UNIQUE və ya CONCURRENTLY kimi opsiyalardan istifadə etmək lazımdır. Bunlar vacibdir, əgər sadəcə indekslərdən istifadə etmək yox, həm də onları düzgün idarə etmək istəyirsənsə.

CREATE INDEX sintaksisi

İndeks yaratmaq üçün CREATE INDEX komandasından istifadə edirik. Əsas sintaksisi belədir:

CREATE INDEX index_name
ON table_name (column_name);
  • index_name — İndeksin adı. Yaxşı olar ki, adı indeksin məqsədini göstərsin, məsələn, idx_users_email — users cədvəlindəki email sütunu üçün indeks.
  • table_name — İndeks yaradılan cədvəlin adı.
  • column_name — İndekslənəcək sütun.

Sadə bir nümunə göstərək. Tutaq ki, bizdə users cədvəli var:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(255),
    age INT
);

İstəyirik ki, istifadəçiləri email sahəsinə görə daha tez tapaq. İndeks yaradırıq:

CREATE INDEX idx_users_email
ON users (email);

İndi, məsələn, belə bir sorğu işlədərkən:

SELECT * FROM users WHERE email = 'example@example.com';

PostgreSQL idx_users_email indeksindən istifadə edəcək və lazım olan sətri tez tapacaq.

Unikal indekslər (UNIQUE)

Unikal indeks — bu, göstərilən sütunda və ya sütunlarda dəyərlərin unikal olmasına zəmanət verir. Əgər eyni dəyəri ikinci dəfə əlavə etməyə çalışsan, PostgreSQL buna icazə verməyəcək.

Unikal indekslər adətən email, username və ya təkrarlanmamalı olan digər identifikatorlar üçün istifadə olunur.

Unikal indeksin yaradılması sintaksisi

Unikal indeks yaratmaq üçün sintaksis adi indeksə bənzəyir, sadəcə UNIQUE açar sözü əlavə olunur:

CREATE UNIQUE INDEX index_name
ON table_name (column_name);

Tutaq ki, bizim users cədvəlimizdə email sahəsi unikal olmalıdır ki, iki istifadəçi eyni email ilə qeydiyyatdan keçə bilməsin. Belə edirik:

CREATE UNIQUE INDEX idx_users_email_unique
ON users (email);

İndi, məsələn, belə bir əməliyyat etsən:

INSERT INTO users (name, email, age) VALUES ('John', 'john@example.com', 30);
INSERT INTO users (name, email, age) VALUES ('Jane', 'john@example.com', 25);

PostgreSQL səhv atacaq, çünki email unikal olmalıdır.

CONCURRENTLY parametri ilə indekslərin yaradılması

Təsəvvür elə ki, prod-da böyük bir cədvəllə işləyirsən və ora daim yeni məlumatlar əlavə olunur. Standart rejimdə (CREATE INDEX) indeks yaratmaq cədvəli bloklayır, başqa sorğuların insert, update və ya delete etməsinə imkan vermir. Bu, işləyən sistem üçün fəlakət ola bilər. Bunun qarşısını almaq üçün CONCURRENTLY parametri ilə "asinxron" indeks yarada bilərsən.

Sintaksis

CREATE INDEX CONCURRENTLY index_name
ON table_name (column_name);

CONCURRENTLY açar sözü PostgreSQL-ə deyir ki, indeks paralel şəkildə, cədvəli bloklamadan yaradılsın.

Tutaq ki, bizdə orders cədvəli var, milyonlarla sətri var və daim yeni sifarişlər əlavə olunur:

CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    order_number VARCHAR(50) NOT NULL,
    order_date DATE NOT NULL,
    customer_id INT NOT NULL
);

İstəyirsən ki, order_date üzrə axtarış sürətlənsin, amma cədvəl bloklanmasın:

CREATE INDEX CONCURRENTLY idx_orders_order_date
ON orders (order_date);

İndi verilənlər bazası indeksi cədvəli bloklamadan yaradacaq və istifadəçilər heç nə hiss etməyəcək.

CONCURRENTLY-nin bəzi özəllikləri:

  1. İndeks adi rejimdən daha yavaş yaradılır, çünki PostgreSQL bu əməliyyatı bir neçə mərhələdə edir.
  2. Əgər indeks yaradılarkən səhv çıxsa (məsələn, təkrarlanan məlumatlara görə), onu əl ilə silib yenidən yaratmaq lazımdır.

Əlavə indeksasiya parametrləri

PostgreSQL indeks yaradanda əlavə parametrlər də verməyə imkan verir. Məsələn, bir neçə sütunu eyni anda indeksləyə bilərsən. Bu, bir neçə sahə üzrə tez-tez filter olunan sorğular üçün faydalıdır.

CREATE INDEX idx_users_name_email
ON users (name, email);

İndi WHERE name = 'John' AND email = 'john@example.com' kimi şərtlərlə sorğular daha sürətli işləyəcək.

Bir sütun üçün iki indeks — bu, iki sütun üçün bir indeks deyil! Bir neçə sütunlu indeks yalnız WHERE-də həmin bütün sütunlar olduqda axtarışı sürətləndirir.

Səhv nümunələri və həlləri

İndeks yaradanda bir neçə tipik səhvlə qarşılaşa bilərsən. Ən çox rast gəlinənlər bunlardır:

Unikal indeks yaradanda dublikat insert səhvi. Əgər cədvəldə artıq təkrarlanan sətrlər varsa, PostgreSQL unikal indeks yarada bilməyəcək. Əvvəlcə dublikatları silmək və ya düzəltmək lazımdır.

DELETE FROM users
WHERE email IN (
    SELECT email
    FROM users
    GROUP BY email
    HAVING COUNT(email) > 1
);

İndeks yaradanda bloklama səhvi. Əgər adi indeks yaratma üsulundan istifadə edirsənsə, istifadəçilər gecikmə və ya error görə bilər. Bu problemi həll etmək üçün CONCURRENTLY parametrindən istifadə et.

İndi təsəvvür elə, bir şirkətdə işləyirsən və sənə milyonlarla sətri olan verilənlər bazasını optimallaşdırmaq tapşırılıb. İndekslərdən istifadə edərək dar boğazları tapıb istifadəçi təcrübəsini sürətləndirə bilərsən. Məsələn, düzgün indeks əlavə etməklə sorğunun işləmə vaxtını 10 saniyədən bir neçə millisaniyəyə endirə bilərsən. Bu, əla deyil?

2
Tapşırıq
SQL SELF, səviyyə, dərs
Bağlanıb
Unikal indeks
Unikal indeks
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION