Database Index เป็นโครงสร้างข้อมูลที่เพิ่มความเร็วในการ Query (SELECT) แต่นำไปสู่ Overhead ตอน INSERT/UPDATE/DELETE
Best Practices สำคัญ
1. Index เฉพาะคอลัมน์ที่ใช้ใน WHERE, JOIN, ORDER BY, GROUP BY
-- ดี: ใช้ใน WHERE
CREATE INDEX idx_email ON users(email);
-- ไม่ดี: ไม่ได้ Query บ่อย
CREATE INDEX idx_bio ON users(bio);
2. Composite Index (Multi-column Index) - ใส่คอลัมน์ Selectivity สูงก่อน
-- Query: WHERE last_name = 'Smith' AND first_name = 'John'
-- ดี: last_name selectivity สูงกว่า (Unique มากกว่า)
CREATE INDEX idx_name ON users(last_name, first_name);
3. หลักการ Leftmost Prefix (สำคัญ!)
Composite Index (A, B, C) ใช้ได้กับ:
- WHERE A = ?
- WHERE A = ? AND B = ?
- WHERE A = ? AND B = ? AND C = ?
- ❌ WHERE B = ? (ไม่ใช้ Index)
- ❌ WHERE C = ? (ไม่ใช้ Index)
- ❌ WHERE B = ? AND C = ? (ไม่ใช้ Index)
4. หลีกเลี่ยง Over-Indexing
- แต่ละ Index = Overhead ตอน Write (INSERT/UPDATE/DELETE)
- Index มากเกินไป = ช้า ตอน Write, ใช้ Disk มาก
- กฎนิ้ว: ไม่เกิน 5-6 Index ต่อตาราง (ขึ้นกับ Workload)
5. Covering Index (Index Only Scan)
-- Query: SELECT id, email FROM users WHERE status = 'active';
-- สร้าง Index ครอบคลุมทุกคอลัมน์ที่ SELECT
CREATE INDEX idx_status_covering ON users(status, id, email);
6. ใช้ EXPLAIN วิเคราะห์ Query Plan
EXPLAIN SELECT * FROM users WHERE email = 'john@example.com';
-- ดู key, key_len, rows, Extra (Using index, Using where, Using filesort)
ตัวอย่างสร้าง Index
CREATE TABLE IndexingDemo (
Id INT,
Name VARCHAR(100)
);
CREATE INDEX indexName ON IndexingDemo(Name);
Index Types ใน MySQL
| Type | ใช้เมื่อ |
|---|---|
| B-Tree (Default) | ทุกกรณีทั่วไป (=, >, <, BETWEEN, LIKE 'prefix%') |
| Hash | Memory Table, Equality (=) เท่านั้น |
| Fulltext | Full-text Search (MATCH AGAINST) |
| Spatial (R-Tree) | Geometric Data (POINT, POLYGON) |
สรุป Checklist
- ☐ Index คอลัมน์ใน WHERE/JOIN/ORDER BY
- ☐ Composite Index: ใส่ Selectivity สูงก่อน, ใช้ Leftmost Prefix
- ☐ ไม่ Over-Index (ลบ Index ที่ไม่ใช้ด้วย
DROP INDEX) - ☐ ใช้ Covering Index สำหรับ Query สำคัญ
- ☐ ตรวจสอบด้วย
EXPLAINเป็นประจำ - ☐ Monitor
InnoDB Buffer Poolให้พอ Index