Index ในฐานข้อมูล เข้าใจได้ในสิบนาที

ถ้าจะเทียบง่าย ๆ index คือสารบัญท้ายเล่มหนังสือ ถ้าอยากหาคำว่า "อนุกรมวิธาน" คุณไม่ต้องเปิดทีละหน้าจนกว่าจะเจอ แต่เปิดดัชนีท้ายเล่มแล้วกระโดดไปที่หน้านั้นทันที

ฐานข้อมูลก็ทำอย่างเดียวกัน ต่างกันตรงที่มันเก็บดัชนีนั้นในโครงสร้างชื่อ B-tree ซึ่งค้นหาได้เร็วมากแม้ข้อมูลจะมีหลายล้านแถว

ควรสร้าง index ตรงไหน

กฎปฏิบัติง่าย ๆ คือดูว่าคอลัมน์ไหนมักโผล่ใน WHERE, JOIN หรือ ORDER BY คอลัมน์เหล่านี้คือผู้สมัครหลัก

สถานการณ์ควรทำ index ไหมเหตุผล
ค้นหาด้วย email ที่ไม่ซ้ำควร และควรเป็น uniqueค้นบ่อยและได้การกันข้อมูลซ้ำด้วย
คอลัมน์ status มีแค่ 3 ค่ามักไม่คุ้มเดี่ยว ๆค่าซ้ำสูง ฐานข้อมูลมักเลือกสแกนทั้งตารางอยู่ดี
foreign key ที่ใช้ JOIN บ่อยควรมากหลายฐานข้อมูลไม่สร้างให้อัตโนมัติ
ตาราง log ที่เขียนหนักอ่านน้อยให้น้อยเท่าที่จำเป็นทุก index ทำให้ INSERT ช้าลง

ลำดับคอลัมน์ใน composite index สำคัญมาก

index ที่มีหลายคอลัมน์ทำงานเหมือนสมุดโทรศัพท์ เรียงตามนามสกุลก่อนแล้วจึงชื่อ ถ้าเรารู้นามสกุล เราค้นเจอ แต่ถ้ารู้แค่ชื่อ สมุดนี้ช่วยอะไรไม่ได้เลย

sql
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 ทีละตัวพร้อมวัดผล ไม่ใช่สร้างรวดเดียวสิบตัวเพื่อความสบายใจ

ความคิดเห็น

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