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';