# SQL EXPLAIN — so'rov rejasini o'qish

> SQL EXPLAIN QUERY PLAN bilan baza so'rovni qanday bajarayotganini ko'rish. To'liq skan va indeksli qidiruv farqi, indeks ta'sirini tekshirish.

Manba: https://learncode.uz/sql/explain/
Sana: 2026-06-20

[Optimizatsiya](https://learncode.uz/sql/optimizatsiya) darsida so'rovni tezlashtirish usullarini
ko'rdik. Lekin so'rov aslida **qanday** bajarilayotganini qayerdan bilamiz?
Buni **`EXPLAIN QUERY PLAN`** ko'rsatadi — u bazaning "ish rejasi"ni ochib
beradi.

## So'rov rejasini ko'rish

So'rov oldiga `EXPLAIN QUERY PLAN` qo'yamiz (SQLite'da):

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

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

```sql
EXPLAIN QUERY PLAN
SELECT nom FROM mahsulotlar WHERE narx > 10000;
```

[Indeks](https://learncode.uz/sql/indeks)siz javob taxminan shunday bo'ladi:

```
SCAN buyurtmalar
```

**`SCAN`** — baza butun jadvalni boshdan-oxir o'qiyapti degani. Kichik
jadvalda muammo emas, katta jadvalda esa sekin.

## Indeksdan keyin

Endi `mijoz_id` ga indeks qo'yamiz va rejani qayta ko'ramiz:

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

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

Endi javob o'zgaradi:

```
SEARCH buyurtmalar USING INDEX idx_buyurtmalar_mijoz (mijoz_id=?)
```

**`SEARCH ... USING INDEX`** — baza butun jadvalni o'qimay, indeks orqali
to'g'ri qatorga o'tyapti degani. Indeks ishlaganini shu bilan **tasdiqlaysiz**.

> **Atama**
>
> **So'rov rejasi** (query plan) — bazaning so'rovni bajarish uchun tanlagan
> usuli: qaysi jadvalni qanday o'qishi, indeksdan foydalanish-foydalanmasligi.
> `SCAN` — to'liq o'qish; `SEARCH ... USING INDEX` — indeksli, tez qidiruv.

> **Yodda tuting**
>
> `EXPLAIN QUERY PLAN` — optimizatsiyaning asosiy asbobi. So'rov sekin tuyulsa,
> avval rejani ko'ring: agar katta jadvalda `SCAN` bo'lsa, ehtimol indeks
> kerak. Taxmin qilish o'rniga **o'lchang** — reja aniq ko'rsatadi.

## Amaliy mashq

So'rov rejasini o'qing:

1. `EXPLAIN QUERY PLAN` bilan oddiy `SELECT` rejasini ko'ring;
2. `WHERE` qo'shib, reja o'zgarishini kuzating;
3. `narx` ga indeks yaratib, rejani qayta oling;
4. `JOIN` li so'rovning rejasini ko'ring;
5. `SCAN` va `SEARCH` so'zlarini natijada toping;
6. indeksni `DROP INDEX` bilan o'chirib, reja yana `SCAN` ga
   qaytganini tasdiqlang.

`SCAN` va `SEARCH` orasidagi farq nimani anglatadi?

## Qisqacha xulosa

- `EXPLAIN QUERY PLAN` — baza so'rovni qanday bajarayotganini ko'rsatadi.
- **`SCAN`** — butun jadvalni o'qish (katta jadvalda sekin).
- **`SEARCH ... USING INDEX`** — indeks orqali tez qidiruv.
- Indeks qo'ygandan keyin reja `SCAN` dan `SEARCH` ga o'zgaradi — shu bilan
  indeks ta'sirini tasdiqlaysiz.
- Optimizatsiyada taxmin qilmang — rejani o'qib, aniqlang.

Keyingi darsda [window funksiyalar](https://learncode.uz/sql/window-funksiyalar) — qatorlarni
yig'masdan guruh bo'yicha hisoblashni ko'ramiz.
