Bu modul bazaning ichki ishlashi haqida: ma’lumot diskda qanday joylashadi, katta natija qanday o’qiladi, bir vaqtda kelgan so’rovlar qanday muvofiqlashtiriladi va ma’lumot qanday himoyalanadi.
Row store va column store: kirish
Jadvalni biz qator va ustunlar to’ri sifatida tasavvur qilamiz, lekin diskda ma’lumot chiziqli — ketma-ket baytlar sifatida yoziladi. Uni yozishning ikki yo’li bor.
Row store (qator bo’yicha saqlash) — bitta qatorning barcha ustunlari yonma-yon yotadi:
[1, Aziz, 101, 85][2, Malika, 102, 92][3, Bobur, 101, 74]
Column store (ustun bo’yicha saqlash) — bitta ustunning barcha qiymatlari yonma-yon yotadi:
[1, 2, 3][Aziz, Malika, Bobur][101, 102, 101][85, 92, 74]
Ikkalasi ham bir xil ma’lumotni saqlaydi va bir xil SQL’ni tushunadi — farq faqat joylashuvda. Lekin aynan shu joylashuv tezlikni belgilaydi.
Row va column store: afzallik va kamchiliklar
Bitta talabaning butun kartochkasi kerak bo’lsa, row store yutadi: qator diskda bitta joyda yotadi, uni bir o’qishda olish mumkin. Butun jadval bo’yicha faqat bitta ustundan o’rtacha hisoblash kerak bo’lsa, column store yutadi: kerakli ustun ketma-ket yotgani uchun boshqa ustunlar umuman o’qilmaydi.
| Xususiyat | Row store | Column store |
|---|---|---|
| Bitta qatorni to’liq o’qish | Tez | Sekin (ustunlar yig’iladi) |
| Bitta ustun bo’yicha hisoblash | Sekin (butun jadval o’qiladi) | Tez |
| Yozuv qo’shish va yangilash | Tez | Qimmatroq |
| Siqish (compression) | O’rtacha | Yuqori — qiymatlar bir xil turdagi |
| Mos vazifa | Tranzaksion tizim (OLTP) | Analitika va hisobot (OLAP) |
Shu sababli bank yoki onlayn do’kon bazasi odatda row store (PostgreSQL, MySQL), hisobot va katta hajmli analitika esa column store (ClickHouse) ustida quriladi. Zamonaviy tizimlar ko’pincha ikkalasini birga ishlatadi: asosiy baza row store, undan nusxa ko’chirilgan analitik ombor column store.
Database cursor
Odatiy so’rovda baza natijaning hammasini bir yo’la tayyorlab beradi. Agar natijada millionlab qator bo’lsa, bu xotirani to’ldirib qo’yadi. Kursor (cursor) shu muammoni yechadi: u natijaga ko’rsatkich bo’lib, qatorlarni bo’lak-bo’lak o’qish imkonini beradi.
BEGIN;
DECLARE talaba_kursor CURSOR FOR SELECT ism, ball FROM talabalar ORDER BY id;
FETCH 2 FROM talaba_kursor;
Natija:
ism | ball
--------+------
Aziz | 85
Malika | 92
Keyingi FETCH navbatdagi qatorlarni beradi, ish tugagach kursor CLOSE bilan yopiladi. Kursor ikki holatda foydali: juda katta natijani xotiraga sig’dirmasdan qayta ishlashda va har bir qator ustida alohida amal bajarish kerak bo’lganda. Uning narxi bor — qatorma-qator ishlash ommaviy so’rovdan sekinroq, shuning uchun oddiy vazifani kursorsiz, bitta SQL so’rovi bilan yechish afzal.
Parallel murojaatlar: muammo
Haqiqiy bazaga bir vaqtning o’zida ko’plab foydalanuvchi murojaat qiladi. Agar ikki so’rov bir xil ma’lumotni o’zgartirsa, natija ular qanday navbatlashganiga bog’lanib qoladi.
Klassik misol — hisobdagi 100 000 so’m:
Vaqt A operatsiyasi B operatsiyasi
1 Qoldiqni o'qidi: 100000
2 Qoldiqni o'qidi: 100000
3 50000 ayirdi -> 50000
4 30000 ayirdi -> 70000
5 Yozdi: 50000
6 Yozdi: 70000
Ikkala operatsiya ham bajarildi, lekin hisobda 20 000 emas, 70 000 qoldi — A ning natijasi yo’qoldi. Bu "yo’qolgan yangilanish" (lost update) deyiladi. Shunga o’xshash boshqa muammolar ham bor: hali tasdiqlanmagan ma’lumotni o’qish (dirty read) va ayni so’rovni ikki marta bajarganda turli natija olish (non-repeatable read).
Parallel murojaatlar: yechimlar
Bunday holatlarni bazaning o’zi boshqaradi — bu concurrency control deb ataladi. Asosiy vositalar:
- Tranzaksiya — bir nechta amalni bitta bo’linmas blokka jamlash. Blok yo to’liq bajariladi, yo umuman bajarilmaydi.
- Qulf (lock) — bir so’rov ma’lumot ustida ishlayotganda boshqasini kutishga majburlash.
- Izolyatsiya darajasi — tranzaksiyalar bir-birini qanchalik "ko’rishini" belgilaydigan sozlama.
BEGIN;
UPDATE hisoblar SET qoldiq = qoldiq - 50000 WHERE id = 1;
UPDATE hisoblar SET qoldiq = qoldiq + 50000 WHERE id = 2;
COMMIT;
Bu yerda pul bir hisobdan yechilib, ikkinchisiga o’tkaziladi. Agar ikkinchi UPDATE xato bersa, ROLLBACK birinchisini ham bekor qiladi — pul yo’lda qolib ketmaydi. E’tibor bering, qoldiq qoldiq - 50000 ko’rinishida hisoblanmoqda: qiymat bazaning o’zida yangilanadi, dasturga o’qib olinib qaytarilmaydi — bu yuqoridagi lost update holatining oldini oladi.
Boshlovchilar odatda BEGIN yozib, COMMITni unutadi. Bunda o’zgarishlar boshqa foydalanuvchilarga ko’rinmaydi va tegilgan qatorlar qulflangan holda qolib, boshqa so’rovlarni kutishga majburlaydi.
Ma’lumotlar bazasi xavfsizligi
Baza xavfsizligi bir necha qatlamdan iborat va ularning har biri alohida ishlaydi:
| Qatlam | Nima qiladi |
|---|---|
| Autentifikatsiya | Kim ulanayotganini aniqlaydi (parol, sertifikat) |
| Avtorizatsiya | Kim nimaga huquqli ekanini belgilaydi |
| Tarmoq darajasi | Bazaga faqat ishonchli manzillardan ulanishga ruxsat beradi |
| Shifrlash | Ma’lumotni uzatishda va diskda o’qib bo’lmaydigan qiladi |
| Audit | Kim, qachon, nima qilganini yozib boradi |
Huquqlar GRANT va REVOKE bilan boshqariladi:
GRANT SELECT ON talabalar TO hisobotchi;
Bu buyruqdan keyin hisobotchi foydalanuvchisi jadvalni faqat o’qiy oladi — unga INSERT yoki DELETE ta’sir qilmaydi. Asosiy tamoyil — eng kam imtiyoz (least privilege): har bir foydalanuvchi va dastur o’z vazifasi uchun zarur bo’lgan minimal huquqni oladi. Veb-dastur bazaga administrator huquqi bilan ulanmasligi kerak.
Alohida xavf — SQL injection: foydalanuvchi kiritgan matnni to’g’ridan-to’g’ri so’rov satriga qo’shish. Himoya usuli oddiy — so’rovga qiymatlarni parametr sifatida uzatish, satrni yopishtirib yasamaslik.
Backup olish va uni tiklash
Zaxira nusxa (backup) — ma’lumotni yo’qotishdan himoya qiluvchi oxirgi chegara. Disk ishdan chiqishi, jadval xato o’chirilishi yoki server buzilishi mumkin; bu holatlarning barchasida yagona najot — yaqinda olingan nusxa.
pg_dump -U foydalanuvchi baza_nomi > zaxira.sql
psql -U foydalanuvchi baza_nomi < zaxira.sql
Birinchi buyruq bazaning butun holatini matnli faylga yozadi, ikkinchisi shu fayldan bazani qayta tiklaydi.
Amalda e’tiborga olinadigan uchta narsa bor. Birinchisi — muntazamlik: zaxira qo’lda emas, jadval bo’yicha avtomatik olinishi kerak. Ikkinchisi — joylashuv: nusxa baza turgan serverning o’zida yotsa, server yo’qolganda u ham yo’qoladi. Uchinchisi va eng ko’p e’tibordan chetda qoladigani — tiklashni sinab ko’rish: hech qachon tiklanmagan zaxira aslida zaxira emas, chunki uning ishlashiga ishonch yo’q.
Amaliyot
- Quyidagi vazifalarning har biri uchun row store yoki column store mosligini aniqlang: internet-do’kon buyurtmalari; bir yillik savdo bo’yicha oylik hisobot; foydalanuvchi profilini ochish.
- Kursor qaysi holatda kerak bo’ladi va qaysi holatda oddiy
SELECTyetarli? Ikkita misol keltiring. - Yuqoridagi hisob misolini qog’ozda qaytadan chizing va tranzaksiya ishlatilganda vaqt jadvali qanday o’zgarishini ko’rsating.
- Faqat hisobot o’qiydigan foydalanuvchi uchun kerakli
GRANTso’rovlarini yozing va unga nima uchunDELETEhuquqi berilmasligini tushuntiring. - Kichik loyiha uchun zaxira rejasini tuzing: qanchalik tez-tez, qayerda saqlanadi va tiklash qanday tekshiriladi?
Yakuniy test bu modulning barcha mavzularini qamrab oladi.