~/VibeHandbook
PDF ฟรี

บท 14 · 05

การทำ Index

Index เปรียบเหมือนดัชนีท้ายเล่มหนังสือ มันทำให้ฐานข้อมูลกระโดดตรงไปยังแถวที่ตรงกันได้ทันที แทนที่จะต้องสแกนทุกแถว หากไม่มี index คิวรีจะช้าลงเรื่อย ๆ เมื่อข้อมูลเพิ่มขึ้น — ที่ 100 แถวไม่มีปัญหาเลย แต่ที่ 1,000,000 แถวจะเจ็บปวดมาก

หากไม่มี index ฐานข้อมูลจะตรวจสอบทุกแถวตามลำดับ แต่ถ้ามี index มันจะกระโดดตรงไปยังจุดที่ตรงกันเลย เหมือนกับดัชนีในหนังสือที่พาคุณไปยังหน้าที่ถูกต้องแทนที่จะต้องอ่านตั้งแต่ต้นจนจบ

  NO INDEX  (Seq Scan)              WITH INDEX  (Index Scan)
  read EVERY row, one by one        jump straight to matches
  ┌─────────────────────┐          ┌─────────────┐
  │ row 1   ✗           │          │   INDEX     │
  │ row 2   ✗           │          │ author_id   │
  │ row 3   ✓  match     │  ◀──────┐ │   ──┬──     │
  │ row 4   ✗           │         │ └─────┼───────┘
  │ ...     (1,000,000) │         │       ▼
  │ row N   ✓  match     │         └──▶ rows 3, 998   ✓
  └─────────────────────┘          a few hops, not a million

คำแนะนำเชิงปฏิบัติ

  • ทำ index ให้กับคอลัมน์ที่คุณ กรอง (filter) หรือ join บ่อย ๆ (เช่น author_id, email)
  • Primary key ถูกทำ index ให้อัตโนมัติอยู่แล้ว
  • อย่า index ทุกอย่าง — แต่ละ index ช่วยให้การอ่านเร็วขึ้น แต่ทำให้การเขียนช้าลงและใช้พื้นที่เพิ่ม
  • เพิ่ม index เมื่อคุณเห็นคิวรีที่ทำงานช้า ไม่ใช่เพิ่มล่วงหน้าให้ทุกคอลัมน์

วิธีที่ซื่อสัตย์ในการหาว่า index ช่วยได้จริงหรือไม่ คือการถามฐานข้อมูล ไม่ใช่การเดาเอาเอง ทุกเอนจิน มีคำสั่ง EXPLAIN (ใน Postgres คือ EXPLAIN ANALYZE) ซึ่งแสดงแผนการทำงานที่มันจะใช้

EXPLAIN ANALYZE
SELECT * FROM posts WHERE author_id = '...';

ถ้าผลลัพธ์แสดง Seq Scan บนตารางขนาดใหญ่ แปลว่าฐานข้อมูลกำลังอ่านทุกแถว ซึ่งเป็นสัญญาณว่า index จะช่วยได้ หลังจากเพิ่ม index แล้ว มันควรเปลี่ยนไปเป็น Index Scan นี่เป็นงานที่เหมาะมากที่จะมอบให้ AI ทำ วางคิวรีที่ช้าและผลลัพธ์ของ EXPLAIN ลงไป แล้วถามว่าควรเพิ่ม index ตัวไหนและเพราะอะไร คุณยังคงควบคุมสถานการณ์ได้ด้วยการเข้าใจคำตอบ ไม่ใช่ด้วยการท่องจำทฤษฎี index

อยากได้แบบออฟไลน์?

ดาวน์โหลดหนังสือทั้งเล่มเป็น PDF หรือ EPUB — ฟรี