IlmHamroh
Python kursi/Bazalar va ORM3/12-dars16 daqiqa
Mundarija (22)

23.3-dars: Indekslar

23-QISM — BAZALAR VA ORM · 3-dars


1. Kirish va motivatsiya

So'rovlar (SELECT, JOIN) ma'lumot ko'payganda sekinlashadi: baza har satrni tekshiradi (to'liq skaner). Yechim — indeks. Indeks — jadval ustuni uchun maxsus tuzilma (kitob indeksi kabi), so'rovni tez qiladi. Ma'lumot ko'p bo'lganda indeks yo'q — sekin; indeks bilan — tez.

Indeks — kitobning oxiridagi alifboli ko'rsatkich kabi: so'zni (qiymatni) tez topish uchun. Usiz — butun kitobni (jadvalni) varaqlaysiz (skaner); bilan — indeksga qarab darrov topasiz (qidiruv). To'g'ri indeks — sekin so'rovni minglab barobar tezlashtiradi. Bu backend'ning eng muhim optimizatsiyasi.

Real vaziyat. Bir ilova o'sdi — million foydalanuvchi. Login so'rovi (WHERE email = ?) sekinlashdi (2 soniya — har login butun jadvalni skaner qildi). Dasturchi email ustuniga indeks qo'shdi: so'rov 2 soniyadan 2 millisekundga tushdi (1000 barobar). To'g'ri indeks — sekin bazani tez qiladi. Indeks yo'qligi — eng keng tarqalgan unumdorlik muammosi.

Bu darsda indekslarni — nima, qachon kerak va qanday ishlashini o'rganamiz.

Bu darsda:

  • Indeks nima
  • To'liq skaner vs indeks qidiruv
  • CREATE INDEX
  • EXPLAIN QUERY PLAN (so'rov rejasi)
  • Qaysi ustunga indeks
  • Kompozit indeks (bir necha ustun)
  • Indeks narxi (yozish sekinlashadi)
  • Amaliy: indeks bilan tezlashtirish

ℹ Misollarda sqlite3 va EXPLAIN QUERY PLAN bilan sinaladi.


2. Nazariya — chuqur tushuntirish

2.1. Indeks nima

Indeks — ustun qiymatlari uchun saralangan maxsus tuzilma:

Jadval (kurs):           Indeks (nom bo'yicha):
id | nom     | narx      nom      → satr
1  | Python  | 100       Go       → 2
2  | Go      | 120       Java     → 4
3  | Rust    | 150       Python   → 1
4  | Java    | 90        Rust     → 3

Indeks — ustun qiymatlarini saralangan holda saqlaydi (satrga havola bilan). Bu kitob indeksi kabi: so'zni (qiymatni) tez topish. Baza indeksga qarab darrov topadi (butun jadvalni skaner qilmasdan). Indeks — qidiruv tezligi uchun.

2.2. To'liq skaner vs indeks qidiruv

Indekssiz — to'liq skaner (har satr); indeks bilan — qidiruv:

Indekssiz Indeks bilan
SCAN (har satr) SEARCH (indeks)
O(n) — sekin O(log n) — tez
Million satr — million tekshiruv Million satr — ~20 qadam

Indekssiz so'rov (WHERE nom = 'X') — butun jadvalni skaner (har satrni tekshiradi, O(n)). Indeks bilan — saralangan indeksda ikkilik qidiruv (O(log n)). Million satrda: skaner — million qadam; indeks — ~20 qadam. Bu katta farq.

2.3. CREATE INDEX

Indeks yaratish:

sql
CREATE INDEX idx_nom ON kurs(nom);          -- oddiy indeks
CREATE UNIQUE INDEX idx_email ON foydalanuvchi(email);  -- unique

CREATE INDEX nom ON jadval(ustun) — ustunga indeks. UNIQUE INDEX — qiymatlar takrorlanmasin (email, username). Birlamchi kalit (PRIMARY KEY) avtomatik indeksli. Indeks yaratish — bir marta, keyin so'rovlar tez.

2.4. EXPLAIN QUERY PLAN

EXPLAIN QUERY PLAN — so'rov qanday bajarilishini ko'rsatadi:

sql
EXPLAIN QUERY PLAN SELECT * FROM kurs WHERE nom = 'Python';
-- indekssiz: SCAN kurs
-- indeks bilan: SEARCH kurs USING INDEX idx_nom (nom=?)

EXPLAIN QUERY PLAN — so'rov rejasi: SCAN (to'liq skaner — sekin) yoki SEARCH USING INDEX (indeks — tez). Bu indeks ishlatilayotganini tekshiradi. Sekin so'rovni tahlil qilishda birinchi qadam.

2.5. Qaysi ustunga indeks

Indeks qo'shish mezonlari:

Indeks qo'y Sabab
WHERE ustunlari Filtr tez
JOIN ustunlari Bog'lash tez (tashqi kalit)
ORDER BY ustunlari Saralash tez
Unique (email) Takror yo'q + tez

Indeks — tez-tez qidiruv/filtr qilinadigan ustunga (WHERE email, JOIN muallif_id, ORDER BY sana). Har ustunga emas (indeks joy va yozish narxi). Tashqi kalitlarga (JOIN uchun) indeks muhim 23.2-bob.

2.6. Kompozit indeks

Kompozit — bir necha ustun bo'yicha indeks:

sql
CREATE INDEX idx_til_narx ON kurs(til, narx);
-- WHERE til = 'uz' AND narx > 100 — ikkalasi uchun tez

Kompozit indeks — bir necha ustun birga ((til, narx)). WHERE til = ... AND narx = ... — ikkalasi uchun tez. Tartib muhim: (til, narx) indeksi til bo'yicha filtr uchun ishlaydi, faqat narx uchun yo'q (chapdan). Ko'p ustunli filtr uchun.

2.7. Indeks narxi

Indeks bepul emas — yozish sekinlashadi:

Foyda Narx
Qidiruv tez INSERT/UPDATE sekin (indeks yangilanadi)
SELECT tez Joy (indeks disk oladi)

Indeks — o'qish (SELECT) tez, lekin yozish (INSERT, UPDATE, DELETE) sekinroq (indeks ham yangilanadi) va joy oladi. Shuning uchun har ustunga indeks emas — faqat kerakli (tez-tez qidiriladigan). O'qish ko'p → indeks; yozish ko'p → ehtiyot.

2.8. Indeks — o'zaro kelishuv

Vaziyat Indeks
Ko'p SELECT, kam INSERT Ko'proq indeks
Ko'p INSERT, kam SELECT Kam indeks
Katta jadval Indeks zarur
Kichik jadval Indeks kam foyda

Indeks — o'zaro kelishuv (trade-off, 22.4): o'qish tezligi vs yozish tezligi + joy. Katta, ko'p qidiriladigan jadval — indeks zarur; kichik yoki ko'p yoziladigan — ehtiyot. To'g'ri indeks (kerakli ustunga) — so'rovni tezlashtiradi, ortiqcha indeks — yozishni sekinlashadi.


3. Tez ma'lumotnoma

sql
-- indeks yaratish:
CREATE INDEX idx_nom ON kurs(nom);
CREATE UNIQUE INDEX idx_email ON foydalanuvchi(email);
CREATE INDEX idx_til_narx ON kurs(til, narx);   -- kompozit

-- so'rov rejasi (indeks ishlaydimi):
EXPLAIN QUERY PLAN SELECT * FROM kurs WHERE nom = 'Python';
-- SCAN kurs                          → indekssiz (sekin)
-- SEARCH kurs USING INDEX idx_nom    → indeks (tez)

Qaysi ustunga indeks

WHERE ustunlari · JOIN (tashqi kalit) · ORDER BY · UNIQUE (email)
narx: o'qish tez, yozish sekin (o'zaro kelishuv)

4. Batafsil misollar

Misollarda sqlite3 va EXPLAIN QUERY PLAN bilan sinaladi.

Misol 1 — To'liq skaner vs indeks

python
"""indekssiz SCAN; indeks bilan SEARCH; CREATE INDEX; EXPLAIN QUERY PLAN farqi."""

import warnings
warnings.filterwarnings("ignore")

import sqlite3


def main() -> None:
    conn = sqlite3.connect(":memory:")
    conn.row_factory = sqlite3.Row
    cur = conn.cursor()
    cur.execute("CREATE TABLE kurs (id INTEGER PRIMARY KEY, nom TEXT, narx INTEGER)")
    cur.executemany(
        "INSERT INTO kurs (nom, narx) VALUES (?, ?)",
        [(f"Kurs{i}", i * 10) for i in range(1, 101)],
    )
    conn.commit()

    print("=== 1. Indekssiz (SCAN — to'liq skaner) ===")
    reja = cur.execute("EXPLAIN QUERY PLAN SELECT * FROM kurs WHERE nom = 'Kurs50'").fetchall()
    print(f"  reja: {[r['detail'] for r in reja]}")

    print("\n=== 2. Indeks yaratish (CREATE INDEX) ===")
    cur.execute("CREATE INDEX idx_nom ON kurs(nom)")
    print("  idx_nom yaratildi")

    print("\n=== 3. Indeks bilan (SEARCH USING INDEX) ===")
    reja = cur.execute("EXPLAIN QUERY PLAN SELECT * FROM kurs WHERE nom = 'Kurs50'").fetchall()
    print(f"  reja: {[r['detail'] for r in reja]}")

    print("\n=== 4. Natija bir xil, tezlik farqi ===")
    natija = cur.execute("SELECT nom, narx FROM kurs WHERE nom = 'Kurs50'").fetchone()
    print(f"  topildi: {natija['nom']}, {natija['narx']}")
    print("  ⭐ indekssiz — SCAN (har satr); indeks — SEARCH (tez qidiruv)")

    conn.close()


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Indekssiz (SCAN — to'liq skaner) ===
  reja: ['SCAN kurs']

=== 2. Indeks yaratish (CREATE INDEX) ===
  idx_nom yaratildi

=== 3. Indeks bilan (SEARCH USING INDEX) ===
  reja: ['SEARCH kurs USING INDEX idx_nom (nom=?)']

=== 4. Natija bir xil, tezlik farqi ===
  topildi: Kurs50, 500
  ⭐ indekssiz — SCAN (har satr); indeks — SEARCH (tez qidiruv)

Nima ko'rsatdi: 2.1, 2.2, 2.3, 2.4-bo'limlar.

Misol 2 — Indeks turlari

python
"""oddiy indeks; UNIQUE indeks (takror yo'q); kompozit indeks (bir necha ustun); indekslar ro'yxati."""

import warnings
warnings.filterwarnings("ignore")

import sqlite3


def main() -> None:
    conn = sqlite3.connect(":memory:")
    conn.row_factory = sqlite3.Row
    cur = conn.cursor()
    cur.execute("CREATE TABLE kurs (id INTEGER PRIMARY KEY, nom TEXT, narx INTEGER, til TEXT)")
    cur.executemany(
        "INSERT INTO kurs (nom, narx, til) VALUES (?, ?, ?)",
        [(f"Kurs{i}", i * 10, "uz" if i % 2 else "en") for i in range(1, 51)],
    )
    conn.commit()

    print("=== 1. Oddiy indeks ===")
    cur.execute("CREATE INDEX idx_nom ON kurs(nom)")
    print("  idx_nom (nom bo'yicha)")

    print("\n=== 2. UNIQUE indeks (takror yo'q) ===")
    cur.execute("CREATE UNIQUE INDEX idx_nom_unique ON kurs(nom)")
    print("  idx_nom_unique — nom takrorlanmasin")
    try:
        cur.execute("INSERT INTO kurs (nom, narx, til) VALUES ('Kurs1', 5, 'uz')")
    except sqlite3.IntegrityError:
        print("  ⚠️ takror 'Kurs1' rad etildi (UNIQUE)")

    print("\n=== 3. Kompozit indeks (til, narx) ===")
    cur.execute("CREATE INDEX idx_til_narx ON kurs(til, narx)")
    reja = cur.execute("EXPLAIN QUERY PLAN SELECT * FROM kurs WHERE til = 'uz' AND narx > 100").fetchall()
    print(f"  reja: {[r['detail'] for r in reja]}")

    print("\n=== 4. Indekslar ro'yxati ===")
    idx = cur.execute("SELECT name FROM sqlite_master WHERE type='index' AND name LIKE 'idx%' ORDER BY name").fetchall()
    print(f"  indekslar: {[r['name'] for r in idx]}")
    print("  ⭐ oddiy, UNIQUE (takror yo'q), kompozit (bir necha ustun)")

    conn.close()


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Oddiy indeks ===
  idx_nom (nom bo'yicha)

=== 2. UNIQUE indeks (takror yo'q) ===
  idx_nom_unique — nom takrorlanmasin
  ⚠️ takror 'Kurs1' rad etildi (UNIQUE)

=== 3. Kompozit indeks (til, narx) ===
  reja: ['SEARCH kurs USING INDEX idx_til_narx (til=? AND narx>?)']

=== 4. Indekslar ro'yxati ===
  indekslar: ['idx_nom', 'idx_nom_unique', 'idx_til_narx']
  ⭐ oddiy, UNIQUE (takror yo'q), kompozit (bir necha ustun)

Nima ko'rsatdi: 2.3, 2.5, 2.6-bo'limlar.

Misol 3 — Qaysi ustunga indeks (JOIN, WHERE)

python
"""JOIN ustuniga indeks (tashqi kalit); WHERE ustuni; indeksli vs indekssiz ustun; EXPLAIN."""

import warnings
warnings.filterwarnings("ignore")

import sqlite3


def main() -> None:
    conn = sqlite3.connect(":memory:")
    conn.row_factory = sqlite3.Row
    cur = conn.cursor()
    cur.execute("CREATE TABLE muallif (id INTEGER PRIMARY KEY, ism TEXT)")
    cur.execute("CREATE TABLE kurs (id INTEGER PRIMARY KEY, nom TEXT, muallif_id INTEGER, narx INTEGER)")
    cur.executemany("INSERT INTO muallif (id, ism) VALUES (?, ?)", [(i, f"Muallif{i}") for i in range(1, 11)])
    cur.executemany(
        "INSERT INTO kurs (nom, muallif_id, narx) VALUES (?, ?, ?)",
        [(f"Kurs{i}", (i % 10) + 1, i * 10) for i in range(1, 51)],
    )
    conn.commit()

    print("=== 1. WHERE ustuniga indeks ===")
    cur.execute("CREATE INDEX idx_narx ON kurs(narx)")
    reja = cur.execute("EXPLAIN QUERY PLAN SELECT * FROM kurs WHERE narx = 100").fetchall()
    print(f"  narx (indeksli): {[r['detail'] for r in reja]}")

    print("\n=== 2. Indekssiz ustun (SCAN) ===")
    reja = cur.execute("EXPLAIN QUERY PLAN SELECT * FROM kurs WHERE nom = 'Kurs5'").fetchall()
    print(f"  nom (indekssiz): {[r['detail'] for r in reja]}")

    print("\n=== 3. JOIN ustuniga indeks (tashqi kalit) ===")
    cur.execute("CREATE INDEX idx_muallif_id ON kurs(muallif_id)")
    reja = cur.execute(
        "EXPLAIN QUERY PLAN SELECT kurs.nom, muallif.ism FROM muallif "
        "JOIN kurs ON kurs.muallif_id = muallif.id"
    ).fetchall()
    print(f"  JOIN reja: {[r['detail'] for r in reja]}")

    print("\n=== 4. Indeks JOIN'ni tezlashtiradi ===")
    print("  tashqi kalit (muallif_id) indeksi — JOIN tez")
    print("  ⭐ WHERE va JOIN ustunlariga indeks (filtr/bog'lash tez)")

    conn.close()


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. WHERE ustuniga indeks ===
  narx (indeksli): ['SEARCH kurs USING INDEX idx_narx (narx=?)']

=== 2. Indekssiz ustun (SCAN) ===
  nom (indekssiz): ['SCAN kurs']

=== 3. JOIN ustuniga indeks (tashqi kalit) ===
  JOIN reja: ['SCAN kurs', 'SEARCH muallif USING INTEGER PRIMARY KEY (rowid=?)']

=== 4. Indeks JOIN'ni tezlashtiradi ===
  tashqi kalit (muallif_id) indeksi — JOIN tez
  ⭐ WHERE va JOIN ustunlariga indeks (filtr/bog'lash tez)

Nima ko'rsatdi: 2.5-bo'lim.

Misol 4 — Amaliy: indeks bilan optimizatsiya

Sekin so'rovni indeks bilan tezlashtirish jarayonini ko'rsatami: muammoni aniqlash (EXPLAIN), indeks qo'shish, natijani tekshirish. Bu — real unumdorlik optimizatsiyasining namunasi.

python
"""optimizatsiya jarayoni: sekin so'rovni aniqlash (SCAN) → indeks → tekshirish (SEARCH); vaqt farqi."""

import warnings
warnings.filterwarnings("ignore")

import sqlite3
import time


def main() -> None:
    conn = sqlite3.connect(":memory:")
    conn.row_factory = sqlite3.Row
    cur = conn.cursor()
    cur.execute("CREATE TABLE foydalanuvchi (id INTEGER PRIMARY KEY, email TEXT, ism TEXT)")
    cur.executemany(
        "INSERT INTO foydalanuvchi (email, ism) VALUES (?, ?)",
        [(f"user{i}@wisar.uz", f"Ism{i}") for i in range(1, 5001)],
    )
    conn.commit()

    print("=== 1. Muammo: sekin login so'rovi (SCAN) ===")
    reja = cur.execute("EXPLAIN QUERY PLAN SELECT * FROM foydalanuvchi WHERE email = 'user2500@wisar.uz'").fetchall()
    print(f"  reja: {[r['detail'] for r in reja]}")

    print("\n=== 2. Yechim: email'ga indeks ===")
    cur.execute("CREATE INDEX idx_email ON foydalanuvchi(email)")
    print("  idx_email yaratildi")

    print("\n=== 3. Natija: SEARCH (indeks) ===")
    reja = cur.execute("EXPLAIN QUERY PLAN SELECT * FROM foydalanuvchi WHERE email = 'user2500@wisar.uz'").fetchall()
    print(f"  reja: {[r['detail'] for r in reja]}")

    print("\n=== 4. So'rov ishlaydi ===")
    natija = cur.execute("SELECT ism FROM foydalanuvchi WHERE email = 'user2500@wisar.uz'").fetchone()
    print(f"  topildi: {natija['ism']}")
    print(f"  5000 satr, indeks bilan — tez qidiruv (SCAN o'rniga SEARCH)")
    print("  ⭐ EXPLAIN (aniqlash) → CREATE INDEX (yechim) → SEARCH (tez)")

    conn.close()


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Muammo: sekin login so'rovi (SCAN) ===
  reja: ['SCAN foydalanuvchi']

=== 2. Yechim: email'ga indeks ===
  idx_email yaratildi

=== 3. Natija: SEARCH (indeks) ===
  reja: ['SEARCH foydalanuvchi USING INDEX idx_email (email=?)']

=== 4. So'rov ishlaydi ===
  topildi: Ism2500
  5000 satr, indeks bilan — tez qidiruv (SCAN o'rniga SEARCH)
  ⭐ EXPLAIN (aniqlash) → CREATE INDEX (yechim) → SEARCH (tez)

Nima ko'rsatdi: 2.1–2.8-bo'limlar.


5. To'g'ri va noto'g'ri tushunishlar

Noto'g'ri fikr To'g'risi
"Har ustunga indeks" Faqat kerakli (o'zaro kelishuv)
"Indeks bepul" Yozish sekin + joy
"Indeks doim ishlaydi" Faqat mos so'rovda
"Kompozit — istalgan tartib" Chapdan (tartib muhim)
"Kichik jadvalga indeks" Kam foyda
"Indeks natijani o'zgartiradi" Faqat tezlik
"PRIMARY KEY indekssiz" Avtomatik indeksli
"SCAN yaxshi" SEARCH (indeks) tez

6. Keng tarqalgan xatolar va yechimlari

1. JOIN/WHERE ustuniga indekssiz

sql
-- WHERE email = ? — million satr, sekin      # ⚠️ SCAN
CREATE INDEX idx_email ON foydalanuvchi(email);  -- ✅

2. Har ustunga indeks

sql
-- 10 ustun, 10 indeks                         # ⚠️ yozish sekin
-- faqat qidiriladigan ustunga                  # ✅

3. Kompozit tartibni noto'g'ri

sql
CREATE INDEX idx ON kurs(narx, til);          -- WHERE til=? faqat — ishlamaydi
CREATE INDEX idx ON kurs(til, narx);          -- ✅ (chapdan)

4. Indeksni tekshirmaslik (EXPLAIN)

sql
-- so'rov sekin, sabab noma'lum                # ⚠️
EXPLAIN QUERY PLAN SELECT ...                  -- ✅ SCAN vs SEARCH

5. Ko'p yoziladigan jadvalga ortiqcha indeks

sql
-- log jadvali, 5 indeks                        # ⚠️ INSERT sekin
-- kam indeks (yozish ko'p)                      # ✅

6. Unique o'rniga oddiy indeks (email)

sql
CREATE INDEX idx_email ...                     -- takror mumkin
CREATE UNIQUE INDEX idx_email ...              -- ✅ takror yo'q

7. Kichik jadvalga keraksiz indeks

sql
-- 10 satrli jadval + indeks                    # ⚠️ kam foyda
-- kichik jadval — indeks kerak emas             # ✅

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 23.1-dars (o'tilgan): SQL — SELECT/WHERE
  • 23.2-dars (o'tilgan): JOIN — tashqi kalit indeksi
  • 23.9-dars: N+1 — indeks + JOIN
  • 21.3-dars (o'tilgan): model — db_index=True
  • 29-qism: miqyoslash — unumdorlik

8. Eng yaxshi amaliyotlar

  1. WHERE/JOIN/ORDER BY ustunlariga indeks.

  2. Tashqi kalitlarga indeks (JOIN tez).

  3. EXPLAIN QUERY PLAN bilan tekshiring (SCAN vs SEARCH).

  4. Har ustunga emas — faqat kerakli (o'zaro kelishuv).

  5. Kompozit indeksda tartibni to'g'ri (chapdan filtr).

  6. Unique ustunlarga UNIQUE INDEX (email).

  7. Ko'p yoziladigan jadvalga kam indeks.

  8. Katta jadvallarda indeks zarur (kichikda kam foyda).


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

sql
1.  -- indeks nima?
2.  -- SCAN nima?
3.  -- SEARCH nima?
4.  -- CREATE INDEX nima?
5.  -- EXPLAIN QUERY PLAN nima?
6.  -- qaysi ustunga indeks?
7.  -- kompozit indeks nima?
8.  -- kompozit tartibi muhimmi?
9.  -- indeks narxi nima?
10. -- UNIQUE INDEX nima?
11. -- PRIMARY KEY indekslimi?
12. -- indeks natijani o'zgartiradimi?
Javoblar
  1. Ustun uchun saralangan qidiruv tuzilmasi
  2. To'liq skaner (har satr)
  3. Indeks qidiruv (tez)
  4. Ustunga indeks yaratadi
  5. So'rov rejasi (SCAN/SEARCH)
  6. WHERE/JOIN/ORDER BY ustunlari
  7. Bir necha ustun bo'yicha
  8. Ha (chapdan)
  9. Yozish sekin + joy
  10. Takror yo'q + indeks
  11. Ha (avtomatik)
  12. Yo'q (faqat tezlik)

Vazifa 2: Xatolarni tuzating

sql
1.  -- WHERE email = ? indekssiz            -- indeks

2.  CREATE INDEX idx ON kurs(narx, til);    -- tartib (til filtr)

3.  -- so'rov sekin, sabab noma'lum          -- EXPLAIN

4.  CREATE INDEX idx_email ... (email)       -- UNIQUE

5.  -- 10 ustunga 10 indeks                  -- kerakli
Javoblar
sql
1.  CREATE INDEX idx_email ON foydalanuvchi(email);

2.  CREATE INDEX idx ON kurs(til, narx);

3.  EXPLAIN QUERY PLAN SELECT ...

4.  CREATE UNIQUE INDEX idx_email ... (email);

5.  -- faqat qidiriladigan ustunga

Vazifa 3: Indeks optimizatsiyasi

Sekin so'rovni tezlashtiring:

  1. EXPLAIN bilan SCAN aniqlash
  2. Indeks qo'shish
  3. EXPLAIN bilan SEARCH tekshirish
  4. Natijani tasdiqlash

Vazifa 4: Indeks turlari

Turli indekslar:

  1. Oddiy, UNIQUE, kompozit
  2. Har biri uchun so'rov
  3. EXPLAIN bilan tekshirish
  4. Farqni tushuntirish

Vazifa 5: JOIN indeksi

JOIN tezlashtirish:

  1. Tashqi kalit ustuni
  2. Indekssiz JOIN (SCAN)
  3. Indeks qo'shish
  4. EXPLAIN bilan

Vazifa 6: Indeks o'zaro kelishuvi

Foyda vs narx:

  1. Ko'p SELECT — indeks foyda
  2. Ko'p INSERT — indeks narx
  3. Qachon indeks, qachon yo'q
  4. Tahlil

Vazifa 7: O'ylash

Indeks — o'qish tezligi (SELECT) va yozish tezligi (INSERT) o'rtasidagi o'zaro kelishuv (trade-off): indeks qidiruvni tezlashtiradi, lekin yozishni sekinlashtiradi (indeks yangilanadi) va joy oladi. Bu 22.4 dagi "universal eng yaxshi yo'q" kabi — har qaror kelishuv. Muhandislikda "hech narsa bepul emas" (o'zaro kelishuv) tamoyili nima uchun asosiy, va nima uchun "har muammoga indeks/kesh qo'sh" degan yondashuv noto'g'ri?

Javob

Qisqa javob: Indeks o'qishni tezlashtiradi, lekin yozishni sekinlashtiradi va joy oladi — bu o'zaro kelishuv (trade-off): bir narsani yaxshilab, boshqasini yomonlashtirasiz. "Har muammoga indeks qo'sh" noto'g'ri, chunki ortiqcha indeks yozishni sekinlashtiradi (log jadvaliga 10 indeks — INSERT sekin). Muhandislikda "hech narsa bepul emas" asosiy, chunki har qaror (indeks, kesh, async, mikroservis) narx bilan keladi — foyda va narxni o'lchab, vaziyatga qarab tanlanadi. Ko'r-ko'rona optimizatsiya (o'lchamasdan indeks/kesh qo'shish) ba'zan yomonlashtiradi.

1. O'zaro kelishuv (trade-off)

Foyda Narx
Indeks: o'qish tez Yozish sekin, joy
Kesh: tez Xotira, eskirish
Async: yuqori yuklama Murakkablik

2. "Hech narsa bepul emas"

Har qaror narx bilan: indeks (yozish), kesh (xotira + eskirish), mikroservis (murakkablik). Foyda bor, lekin narx ham.

3. "Har muammoga indeks" noto'g'ri

Ortiqcha indeks — yozishni sekinlashtiradi. Keraksiz kesh — eskirgan ma'lumot. O'lchamasdan optimizatsiya — ba'zan yomonlashtiradi.

4. To'g'ri yondashuv

Muammoni o'lcha (EXPLAIN, profiling, 18.7), keyin optimizatsiya (kerakli indeks). "Avval o'lcha, keyin optimallashtir" — ko'r-ko'rona emas.

5. Muhandislik saboqlari

  1. Har qaror o'zaro kelishuv (foyda + narx)
  2. "Hech narsa bepul emas"
  3. O'lchab optimizatsiya (ko'r-ko'rona emas)
  4. Ortiqcha optimizatsiya yomonlashtiradi

6. Xulosa

  1. Indeks — o'qish vs yozish kelishuvi
  2. "Hech narsa bepul emas" (har qaror narx)
  3. O'lchab tanla (EXPLAIN, profiling)
  4. Ko'r-ko'rona optimizatsiya noto'g'ri

Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.


Xulosa

Bu darsda indekslarni o'rgandik.

Eng muhim uch fikr:

  1. Indeks — qidiruv tezligi. Indeks — ustun qiymatlarini saralangan holda saqlovchi maxsus tuzilma (kitob indeksi kabi). Indekssiz so'rov (WHERE nom = 'X') — butun jadvalni skaner (SCAN, har satr, O(n)); indeks bilan — saralangan indeksda ikkilik qidiruv (SEARCH USING INDEX, O(log n)). Million satrda: skaner — million qadam; indeks — ~20 qadam. CREATE INDEX idx_nom ON kurs(nom) — ustunga indeks (UNIQUE INDEX — takror yo'q).

  2. EXPLAIN va qaysi ustun. EXPLAIN QUERY PLAN — so'rov rejasi: SCAN (sekin) yoki SEARCH USING INDEX (tez) — indeks ishlatilayotganini tekshiradi. Indeks — tez-tez qidiruv/filtr qilinadigan ustunga: WHERE (email), JOIN (tashqi kalit — 23.2), ORDER BY (sana). Kompozit indeks ((til, narx)) — bir necha ustun birga, lekin tartib muhim (chapdan filtr uchun ishlaydi).

  3. O'zaro kelishuv. Indeks bepul emas: o'qish (SELECT) tez, lekin yozish (INSERT/UPDATE/DELETE) sekinroq (indeks yangilanadi) va joy oladi. Shuning uchun har ustunga emas — faqat kerakli (tez-tez qidiriladigan). Katta, ko'p qidiriladigan jadval — indeks zarur; kichik yoki ko'p yoziladigan — ehtiyot. Bu "hech narsa bepul emas" (o'zaro kelishuv) tamoyili — muammoni o'lchab (EXPLAIN), keyin optimizatsiya (ko'r-ko'rona emas).

Keyingi darsda tranzaksiyalar ni o'rganamiz: bir necha amalni birga (atomik) bajarish — BEGIN, COMMIT, ROLLBACK va ACID xususiyatlari.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
23.3-dars: Indekslar — IlmHamroh