On this page
Index, Transaction & Constraint
ทำให้ query เร็วขึ้นด้วย index, รับประกันความถูกต้องด้วย transaction และ constraint
เมื่อข้อมูลเยอะและมีหลายคนเขียนพร้อมกัน เราต้องรู้จักเครื่องมือที่ทำให้ฐานข้อมูล "เร็ว" และ "ถูกต้อง" — index, transaction และ constraint
Index — ทำให้ค้นหาเร็ว
index เหมือนสารบัญหนังสือ ช่วยให้ฐานข้อมูลกระโดดไปหาแถวที่ต้องการได้เร็ว แทนการไล่ดูทุกแถว (เชื่อมแนวคิด O(log n) vs O(n) จากบท DSA)
-- สร้าง index บนคอลัมน์ที่ค้นบ่อย
CREATE INDEX idx_users_email ON users(email);
-- query ที่ค้นด้วย email จะเร็วขึ้นมากเมื่อข้อมูลเยอะ
SELECT * FROM users WHERE email = 'aph@example.com';index เร่งการค้นหา แต่ทำให้การ INSERT/UPDATE ช้าลงนิด (ต้องอัปเดต index ด้วย) และกินพื้นที่ — ใส่ index เฉพาะคอลัมน์ที่ค้น/JOIN บ่อยจริง ๆ ไม่ใช่ทุกคอลัมน์
Transaction — กลุ่มคำสั่งที่ต้องสำเร็จพร้อมกัน
บางงานต้องทำหลายคำสั่งให้ "สำเร็จทั้งหมด หรือไม่ทำเลย" เช่นโอนเงิน (หักบัญชี A + เพิ่มบัญชี B) ถ้าครึ่งทางพัง ต้องย้อนทั้งหมด — นี่คือ transaction
BEGIN; -- เริ่ม transaction
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- ยืนยันทั้งหมด
-- ถ้าระหว่างทางมีปัญหา:
-- ROLLBACK; -- ย้อนกลับทุกอย่าง เหมือนไม่เคยทำtransaction รับประกันคุณสมบัติ ACID: Atomicity (ทำครบหรือไม่ทำเลย), Consistency (ข้อมูลคงความถูกต้อง), Isolation (ไม่กวนกันเมื่อทำพร้อมกัน), Durability (commit แล้วอยู่ถาวร) — หัวใจคือ atomicity: โอนเงินต้องไม่หักแล้วไม่เพิ่ม
Constraint — กฎที่ฐานข้อมูลบังคับ
CREATE TABLE users (
id INTEGER PRIMARY KEY,
email TEXT NOT NULL UNIQUE, -- ห้ามว่าง + ห้ามซ้ำ
age INTEGER CHECK (age >= 0), -- ต้อง >= 0
country TEXT DEFAULT 'TH' -- ค่าเริ่มต้น
);| Constraint | บังคับว่า |
|---|---|
| NOT NULL | ห้ามเป็นค่าว่าง |
| UNIQUE | ห้ามซ้ำในคอลัมน์ |
| CHECK | ต้องผ่านเงื่อนไข |
| FOREIGN KEY | ต้องมีอยู่ในตารางที่ชี้ไป |
สรุปหัวข้อนี้
- index = สารบัญ ทำให้ค้นเร็ว แต่ช้าตอนเขียน — ใส่เท่าที่ค้นบ่อย
- transaction: BEGIN...COMMIT ทำครบหรือ ROLLBACK ย้อนทั้งหมด
- ACID — หัวใจคือ atomicity (ทำครบหรือไม่ทำเลย)
- constraint บังคับความถูกต้องระดับ DB: NOT NULL/UNIQUE/CHECK/FK
1) สร้าง index บนคอลัมน์ที่ใช้ค้นบ่อย แล้วอธิบายข้อดี/ข้อเสีย 2) เขียน transaction โอนเงินที่ต้อง atomic 3) ออกแบบตารางที่ใช้ NOT NULL, UNIQUE, CHECK 4) อธิบายว่าทำไมการโอนเงินต้องเป็น transaction