การทำ 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