Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

Best Practices การใช้ Index ใน MySQL

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%')
HashMemory Table, Equality (=) เท่านั้น
FulltextFull-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