Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Indeks nima
- 2.2. To'liq skaner vs indeks qidiruv
- 2.3. CREATE INDEX
- 2.4. EXPLAIN QUERY PLAN
- 2.5. Qaysi ustunga indeks
- 2.6. Kompozit indeks
- 2.7. Indeks narxi
- 2.8. Indeks — o'zaro kelishuv
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — To'liq skaner vs indeks
- Misol 2 — Indeks turlari
- Misol 3 — Qaysi ustunga indeks (JOIN, WHERE)
- Misol 4 — Amaliy: indeks bilan optimizatsiya
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
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 INDEXEXPLAIN QUERY PLAN(so'rov rejasi)- Qaysi ustunga indeks
- Kompozit indeks (bir necha ustun)
- Indeks narxi (yozish sekinlashadi)
- Amaliy: indeks bilan tezlashtirish
ℹ Misollarda
sqlite3vaEXPLAIN QUERY PLANbilan 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 → 3Indeks — 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:
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:
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:
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
-- 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
sqlite3vaEXPLAIN QUERY PLANbilan sinaladi.
Misol 1 — To'liq skaner vs indeks
"""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:
=== 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
"""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:
=== 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)
"""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:
=== 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.
"""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:
=== 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
-- WHERE email = ? — million satr, sekin # ⚠️ SCAN
CREATE INDEX idx_email ON foydalanuvchi(email); -- ✅2. Har ustunga indeks
-- 10 ustun, 10 indeks # ⚠️ yozish sekin
-- faqat qidiriladigan ustunga # ✅3. Kompozit tartibni noto'g'ri
CREATE INDEX idx ON kurs(narx, til); -- WHERE til=? faqat — ishlamaydi
CREATE INDEX idx ON kurs(til, narx); -- ✅ (chapdan)4. Indeksni tekshirmaslik (EXPLAIN)
-- so'rov sekin, sabab noma'lum # ⚠️
EXPLAIN QUERY PLAN SELECT ... -- ✅ SCAN vs SEARCH5. Ko'p yoziladigan jadvalga ortiqcha indeks
-- log jadvali, 5 indeks # ⚠️ INSERT sekin
-- kam indeks (yozish ko'p) # ✅6. Unique o'rniga oddiy indeks (email)
CREATE INDEX idx_email ... -- takror mumkin
CREATE UNIQUE INDEX idx_email ... -- ✅ takror yo'q7. Kichik jadvalga keraksiz indeks
-- 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
WHERE/JOIN/ORDER BYustunlariga indeks.Tashqi kalitlarga indeks (JOIN tez).
EXPLAIN QUERY PLANbilan tekshiring (SCAN vs SEARCH).Har ustunga emas — faqat kerakli (o'zaro kelishuv).
Kompozit indeksda tartibni to'g'ri (chapdan filtr).
Unique ustunlarga
UNIQUE INDEX(email).Ko'p yoziladigan jadvalga kam indeks.
Katta jadvallarda indeks zarur (kichikda kam foyda).
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
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
- Ustun uchun saralangan qidiruv tuzilmasi
- To'liq skaner (har satr)
- Indeks qidiruv (tez)
- Ustunga indeks yaratadi
- So'rov rejasi (SCAN/SEARCH)
WHERE/JOIN/ORDER BYustunlari- Bir necha ustun bo'yicha
- Ha (chapdan)
- Yozish sekin + joy
- Takror yo'q + indeks
- Ha (avtomatik)
- Yo'q (faqat tezlik)
Vazifa 2: Xatolarni tuzating
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 -- kerakliJavoblar
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 ustungaVazifa 3: Indeks optimizatsiyasi
Sekin so'rovni tezlashtiring:
EXPLAINbilan SCAN aniqlash- Indeks qo'shish
EXPLAINbilan SEARCH tekshirish- Natijani tasdiqlash
Vazifa 4: Indeks turlari
Turli indekslar:
- Oddiy, UNIQUE, kompozit
- Har biri uchun so'rov
EXPLAINbilan tekshirish- Farqni tushuntirish
Vazifa 5: JOIN indeksi
JOIN tezlashtirish:
- Tashqi kalit ustuni
- Indekssiz JOIN (SCAN)
- Indeks qo'shish
EXPLAINbilan
Vazifa 6: Indeks o'zaro kelishuvi
Foyda vs narx:
- Ko'p
SELECT— indeks foyda - Ko'p
INSERT— indeks narx - Qachon indeks, qachon yo'q
- 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
- Har qaror o'zaro kelishuv (foyda + narx)
- "Hech narsa bepul emas"
- O'lchab optimizatsiya (ko'r-ko'rona emas)
- Ortiqcha optimizatsiya yomonlashtiradi
6. Xulosa
- Indeks — o'qish vs yozish kelishuvi
- "Hech narsa bepul emas" (har qaror narx)
- O'lchab tanla (EXPLAIN, profiling)
- 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:
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).EXPLAINva qaysi ustun.EXPLAIN QUERY PLAN— so'rov rejasi:SCAN(sekin) yokiSEARCH 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).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.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!