Index ในฐานข้อมูล เข้าใจได้ในสิบนาที
ถ้าจะเทียบง่าย ๆ index คือสารบัญท้ายเล่มหนังสือ ถ้าอยากหาคำว่า "อนุกรมวิธาน" คุณไม่ต้องเปิดทีละหน้าจนกว่าจะเจอ แต่เปิดดัชนีท้ายเล่มแล้วกระโดดไปที่หน้านั้นทันที
ฐานข้อมูลก็ทำอย่างเดียวกัน ต่างกันตรงที่มันเก็บดัชนีนั้นในโครงสร้างชื่อ B-tree ซึ่งค้นหาได้เร็วมากแม้ข้อมูลจะมีหลายล้านแถว
ควรสร้าง index ตรงไหน
กฎปฏิบัติง่าย ๆ คือดูว่าคอลัมน์ไหนมักโผล่ใน WHERE, JOIN หรือ ORDER BY คอลัมน์เหล่านี้คือผู้สมัครหลัก
| สถานการณ์ | ควรทำ index ไหม | เหตุผล |
|---|---|---|
| ค้นหาด้วย email ที่ไม่ซ้ำ | ควร และควรเป็น unique | ค้นบ่อยและได้การกันข้อมูลซ้ำด้วย |
| คอลัมน์ status มีแค่ 3 ค่า | มักไม่คุ้มเดี่ยว ๆ | ค่าซ้ำสูง ฐานข้อมูลมักเลือกสแกนทั้งตารางอยู่ดี |
| foreign key ที่ใช้ JOIN บ่อย | ควรมาก | หลายฐานข้อมูลไม่สร้างให้อัตโนมัติ |
| ตาราง log ที่เขียนหนักอ่านน้อย | ให้น้อยเท่าที่จำเป็น | ทุก index ทำให้ INSERT ช้าลง |
ลำดับคอลัมน์ใน composite index สำคัญมาก
index ที่มีหลายคอลัมน์ทำงานเหมือนสมุดโทรศัพท์ เรียงตามนามสกุลก่อนแล้วจึงชื่อ ถ้าเรารู้นามสกุล เราค้นเจอ แต่ถ้ารู้แค่ชื่อ สมุดนี้ช่วยอะไรไม่ได้เลย
CREATE INDEX idx_orders_shop_created
ON orders (shop_id, created_at DESC);
-- ใช้ index ได้
SELECT * FROM orders WHERE shop_id = 7;
SELECT * FROM orders WHERE shop_id = 7 ORDER BY created_at DESC;
-- ใช้ index นี้ไม่ได้ เพราะข้ามคอลัมน์แรก
SELECT * FROM orders ORDER BY created_at DESC;สิ่งที่ทำให้ index ถูกเมินเฉย
- เอาคอลัมน์ไปครอบในฟังก์ชัน เช่น WHERE LOWER(email) = ? — แก้ด้วย functional index
- เปรียบต่าง type กัน เช่น varchar กับ integer หรือ timestamptz กับ date
- ขึ้นต้นด้วย LIKE '%คำค้น%' — ควรใช้ full-text search แทน
- ตารางเล็กมาก ๆ ระบบอาจเลือกสแกนทั้งตารางเร็วกว่า
ต้นทุนที่หลายคนลืม
index ไม่ได้มาฟรี มันกินพื้นที่ และทุกครั้งที่ INSERT, UPDATE หรือ DELETE ฐานข้อมูลต้องอัปเดตทุก index ที่เกี่ยวข้องด้วย ตารางที่มี index สิบตัวจึงเขียนช้าอย่างมีนัยสำคัญ
วิธีที่ดีคือเริ่มจาก query จริงที่ช้า ดูแผนการทำงาน แล้วเติม index ทีละตัวพร้อมวัดผล ไม่ใช่สร้างรวดเดียวสิบตัวเพื่อความสบายใจ

ความคิดเห็น
กำลังโหลดความคิดเห็น