Indeks โ€” so'rovlar tezligini mislsiz oshiruvchi vosita.

Indeks nima?

Kitob mundarijasini tasavvur qiling โ€” indeks ham shunday, ma'lumot bazasiga tezroq qidirish imkonini beradi.

Indeks yaratish

-- Oddiy indeks
CREATE INDEX idx_talabalar_ism ON talabalar(ism);

-- Yagona indeks (takrorlash mumkin emas)
CREATE UNIQUE INDEX idx_talabalar_email ON talabalar(email);

-- Murakkab indeks
CREATE INDEX idx_shahar_ball ON talabalar(shahar, ball);

-- Indeksni o'chirish
DROP INDEX idx_talabalar_ism;

Qachon indeks kerak?

-- Bu so'rov sekin (100,000 qator skanerlaydi)
SELECT * FROM talabalar WHERE email = 'test@gmail.com';

-- Indeks qo'shgandan keyin tez
CREATE INDEX idx_email ON talabalar(email);
SELECT * FROM talabalar WHERE email = 'test@gmail.com'; -- tez!

So'rov rejasini ko'rish

-- PostgreSQL
EXPLAIN ANALYZE SELECT * FROM talabalar WHERE email = 'test@gmail.com';

-- MySQL
EXPLAIN SELECT * FROM talabalar WHERE email = 'test@gmail.com';

Indeks turlari

-- B-tree (default, eng ko'p ishlatiladigan)
CREATE INDEX idx_ism ON talabalar USING BTREE (ism);

-- Hash (faqat = uchun)
CREATE INDEX idx_email ON talabalar USING HASH (email);

-- GIN (massivlar va JSON uchun)
CREATE INDEX idx_teglar ON postlar USING GIN (teglar);

-- Partial index (faqat ba'zi qatorlar)
CREATE INDEX idx_active ON talabalar(email)
WHERE faol = TRUE;

Indeks qachon yordam bermaydi?

-- Bu indeksdan foydalanmaydi!
SELECT * FROM talabalar WHERE LOWER(email) = 'test@gmail.com';

-- Buning o'rniga:
CREATE INDEX idx_lower_email ON talabalar(LOWER(email));
SELECT * FROM talabalar WHERE LOWER(email) = 'test@gmail.com';

-- NULL qiymatlar bilan ham muammo
-- Kichik jadvallar uchun indeks kerak emas

Statistika

-- PostgreSQL โ€” indeks ishlatilishini ko'rish
SELECT indexname, idx_scan, idx_tup_read
FROM pg_stat_user_indexes
WHERE tablename = 'talabalar';