# SQL INDEX — so'rovni tezlashtirish

> SQL INDEX (indeks) nima va so'rovni qanday tezlashtiradi? Kitob ko'rsatkichi misolida indeksning ishlashi, uni yaratish va qachon ishlatish kerakligi.

Manba: https://learncode.uz/sql/indeks/
Sana: 2026-06-16

Kichik namuna bazamizda so'rovlar bir zumda ishlaydi — atigi bir necha
qator. Lekin jadvalda million qator bo'lsa-chi? O'sha paytda `WHERE` bilan
qidiruv sekinlashib qoladi. Yechim — **INDEX** (indeks). Bu darsda indeks
nima ekanini va so'rovni qanday tezlashtirishini ko'ramiz.

## Muammo: baza har qatorni ko'zdan kechiradi

Quyidagi so'rovni ko'ring:

```sql
SELECT * FROM buyurtmalar WHERE mijoz_id = 1;
```

O'zingiz ishga tushirib ko'ring — so'rovni tahrirlashingiz ham mumkin:

```sql
SELECT * FROM buyurtmalar WHERE mijoz_id = 1;
```

Indekssiz baza bu so'rovni bajarish uchun **butun jadvalni** boshdan-oxir
o'qib chiqadi va har qatorda `mijoz_id = 1` ekanini tekshiradi. 6 qatorda
bu sezilmaydi, ammo 1 000 000 qatorda — million tekshiruv, ya'ni sekin.

## Indeks — kitob oxiridagi ko'rsatkich

**Indeks** — kitob oxiridagi alifboli ko'rsatkichga o'xshaydi. "Python" so'zi
qaysi sahifada ekanini bilish uchun butun kitobni varaqlamaysiz — ko'rsatkichga
qaraysiz va to'g'ri sahifaga o'tasiz.

Baza indeksi ham xuddi shunday: muayyan ustun qiymatlari qaysi qatorda
ekanini oldindan tartiblab saqlaydi. Natijada baza butun jadvalni o'qimay,
to'g'ridan-to'g'ri kerakli qatorlarga o'tadi.

> **Atama**
>
> **Indeks** — ustun qiymatlari bo'yicha alohida saqlanadigan, tartiblangan
> "ko'rsatkich". U jadvaldagi ma'lumotni o'zgartirmaydi, faqat qidiruvni
> tezlashtiradi.

## Indeks yaratish

Indeks `CREATE INDEX` bilan yaratiladi. Tez-tez `WHERE` yoki
[`JOIN`](https://learncode.uz/sql/join) da ishlatiladigan ustunga qo'yiladi:

```sql
CREATE INDEX idx_buyurtmalar_mijoz
ON buyurtmalar(mijoz_id);
```

- `idx_buyurtmalar_mijoz` — indeks nomi (odatda `idx_jadval_ustun` uslubida).
- `buyurtmalar(mijoz_id)` — qaysi jadvalning qaysi ustuni indekslanadi.

Endi `WHERE mijoz_id = 1` so'rovi indeksdan foydalanadi va million qatorda
ham tez ishlaydi.

<Callout type="tip" title="Yodda tuting">
So'rov indeksdan foydalanyaptimi yoki yo'qmi — buni `EXPLAIN QUERY PLAN`
ko'rsatadi:

```sql
EXPLAIN QUERY PLAN
SELECT * FROM buyurtmalar WHERE mijoz_id = 1;
```

Indeksdan keyin javobda `USING INDEX` degan yozuv paydo bo'ladi — demak
baza butun jadvalni o'qimayapti.
</Callout>

## Indeks bepul emas

Indeks qidiruvni tezlashtiradi, lekin uning narxi bor:

- **Joy egallaydi** — indeks alohida saqlanadi, ya'ni qo'shimcha xotira.
- **Yozishni sekinlashtiradi** — har `INSERT`, `UPDATE`, `DELETE` da indeks
  ham yangilanishi kerak.

Shuning uchun **har ustunga indeks qo'yish yaxshi emas**. Indeks tez-tez
qidiriladigan yoki bog'lanadigan ustunlarga qo'yiladi.

> **Boshlovchilar tez-tez yanglishadigan joy**
>
> `PRIMARY KEY` va odatda `UNIQUE` ustunlarga baza **avtomatik** indeks
> yaratadi — ular uchun qo'lda `CREATE INDEX` yozish shart emas. Qo'lda indeks
> ko'proq foreign key va `WHERE` da tez-tez ishlatiladigan oddiy ustunlarga
> kerak bo'ladi.

## Qachon indeks qo'yiladi

| Holat | Indeks kerakmi |
|---|---|
| `WHERE` da tez-tez qidiriladigan ustun | Ha |
| `JOIN` da bog'lanadigan foreign key | Ha |
| `PRIMARY KEY` ustuni | Yo'q — avtomatik bor |
| Kamdan-kam so'raladigan ustun | Yo'q — faqat yuk |

## Amaliy mashq

Indeks yarating:

1. `narx` ustuniga indeks yarating;
2. indeksdan keyin `WHERE narx > 10000` so'rovini bajaring;
3. `EXPLAIN QUERY PLAN` bilan reja o'zgarganini ko'ring;
4. indeksni `DROP INDEX` bilan o'chiring va rejani qayta ko'ring;
5. `nom` ustuniga ham indeks qo'shing;
6. `buyurtmalar(mijoz_id)` ga indeks yaratib, `WHERE mijoz_id = 1`
   rejasida `USING INDEX` paydo bo'lganini tekshiring.

Kichik jadvalda tezlik farqi sezilmaydi — indeks qachon foyda beradi?

## Qisqacha xulosa

- **Indeks** — kitob ko'rsatkichi kabi: baza butun jadvalni o'qimay, kerakli
  qatorga to'g'ri o'tadi.
- `CREATE INDEX nom ON jadval(ustun)` bilan yaratiladi.
- Tez-tez `WHERE`/`JOIN` da ishlatiladigan ustunlarga qo'yiladi.
- Narxi bor: qo'shimcha joy va sekinroq yozish — shuning uchun har ustunga
  emas.
- `PRIMARY KEY` ga indeks avtomatik yaratiladi.

Keyingi darsda [`CREATE TABLE`](https://learncode.uz/sql/create-table) — o'z jadvalingizni
noldan yaratishni ko'ramiz.
