Notes & software courses · Free to learn
Aph's Blog
On this page

Index, Transaction & Constraint

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

ทำให้ query เร็วขึ้นด้วย index, รับประกันความถูกต้องด้วย transaction และ constraint

เมื่อข้อมูลเยอะและมีหลายคนเขียนพร้อมกัน เราต้องรู้จักเครื่องมือที่ทำให้ฐานข้อมูล "เร็ว" และ "ถูกต้อง" — index, transaction และ constraint

Index — ทำให้ค้นหาเร็ว

index เหมือนสารบัญหนังสือ ช่วยให้ฐานข้อมูลกระโดดไปหาแถวที่ต้องการได้เร็ว แทนการไล่ดูทุกแถว (เชื่อมแนวคิด O(log n) vs O(n) จากบท DSA)

sql
-- สร้าง index บนคอลัมน์ที่ค้นบ่อย
CREATE INDEX idx_users_email ON users(email);

-- query ที่ค้นด้วย email จะเร็วขึ้นมากเมื่อข้อมูลเยอะ
SELECT * FROM users WHERE email = 'aph@example.com';
index เร็วตอนอ่าน ช้าตอนเขียน

index เร่งการค้นหา แต่ทำให้การ INSERT/UPDATE ช้าลงนิด (ต้องอัปเดต index ด้วย) และกินพื้นที่ — ใส่ index เฉพาะคอลัมน์ที่ค้น/JOIN บ่อยจริง ๆ ไม่ใช่ทุกคอลัมน์

Transaction — กลุ่มคำสั่งที่ต้องสำเร็จพร้อมกัน

บางงานต้องทำหลายคำสั่งให้ "สำเร็จทั้งหมด หรือไม่ทำเลย" เช่นโอนเงิน (หักบัญชี A + เพิ่มบัญชี B) ถ้าครึ่งทางพัง ต้องย้อนทั้งหมด — นี่คือ transaction

sql
BEGIN;                                          -- เริ่ม transaction
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;                                         -- ยืนยันทั้งหมด

-- ถ้าระหว่างทางมีปัญหา:
-- ROLLBACK;   -- ย้อนกลับทุกอย่าง เหมือนไม่เคยทำ
ACID โดยย่อ

transaction รับประกันคุณสมบัติ ACID: Atomicity (ทำครบหรือไม่ทำเลย), Consistency (ข้อมูลคงความถูกต้อง), Isolation (ไม่กวนกันเมื่อทำพร้อมกัน), Durability (commit แล้วอยู่ถาวร) — หัวใจคือ atomicity: โอนเงินต้องไม่หักแล้วไม่เพิ่ม

Constraint — กฎที่ฐานข้อมูลบังคับ

sql
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