PlusMagi's Blog By Pitt Phunsanit Database การตรวจหาและจัดการ Index: วิธีสแกนหา Unused Index, Duplicate Index และ Missing Index

การตรวจหาและจัดการ Index: วิธีสแกนหา Unused Index, Duplicate Index และ Missing Index

ในระบบฐานข้อมูลที่ซับซ้อนอย่าง PostgreSQL ประสิทธิภาพการทำงานไม่ได้ขึ้นอยู่กับความเร็วของฮาร์ดแวร์เท่านั้น แต่ขึ้นอยู่กับการออกแบบโครงสร้างดัชนี (Index) ที่เหมาะสมด้วย การจัดการ Index ที่ผิดพลาด ไม่ว่าจะเป็นการมี Index ที่ไม่ได้ใช้งาน (Unused), การมี Index ซ้ำซ้อน (Duplicate), หรือการขาด Index ในจุดวิกฤต (Missing) ล้วนเป็นสาเหตุหลักที่ทำให้เกิดคอขวด (bottleneck) และทำให้ระบบทำงานช้าลงอย่างมาก

ในฐานะ Senior Architect การดูแล Index จึงไม่ใช่แค่การสร้างเพื่อเร่งความเร็ว แต่คือการรักษาสมดุลระหว่างภาระงานในการอ่าน (Read) และภาระงานในการเขียน (Write) เพราะทุกครั้งที่มีการ INSERT หรือ UPDATE ข้อมูล ฐานข้อมูลต้องใช้ทรัพยากรในการอัปเดต Index เหล่านั้นด้วย

🔍 3 มิติของการตรวจสอบ Index ใน PostgreSQL

การตรวจสอบเชิงลึกใน PostgreSQL ต้องครอบคลุม 3 ประเด็นหลัก โดยมีวิธีการจัดการที่แตกต่างกัน:

1. Unused Indexes (ดัชนีที่ไม่มีการใช้งาน)

คือ Index ที่ถูกสร้างขึ้นมาแต่ไม่มี Query ใดๆ ในการเรียกใช้เลย การปล่อยทิ้งไว้จะกินพื้นที่จัดเก็บและเพิ่มภาระในการเขียนข้อมูลโดยไม่จำเป็น การตรวจสอบสามารถทำได้โดยการตรวจสอบสถิติการใช้งานของ Index

SQL

SELECT
    indexname,
    tablename,
    idx_scan
FROM
    pg_stat_user_indexes
WHERE
    idx_scan = 0;

เมื่อพบ Index ที่มีค่า idx_scan เป็น 0 ควรพิจารณาลบ Index นั้นทิ้งด้วยคำสั่ง DROP INDEX

2. Duplicate/Redundant Indexes (ดัชนีซ้ำซ้อน)

คือ Index ที่มีคอลัมน์และลำดับการจัดเรียงข้อมูลเหมือนกัน หรือมี Index ที่เป็น Subset ของ Index อื่น (เช่น Index บน (A, B) และ Index บน (A)) การมี Index ซ้ำซ้อนจะทำให้ระบบเสียเวลาในการจัดการโดยไม่จำเป็น

การตรวจสอบต้องใช้การวิเคราะห์ Schema และการเปรียบเทียบ Key อย่างละเอียด หากพบความซ้ำซ้อน ควรเลือกเก็บ Index ที่ครอบคลุมที่สุดและลบส่วนที่เหลือทิ้ง

3. Missing Indexes (ดัชนีที่ขาดหายไป)

คือสถานการณ์ที่ Query มีการกรองข้อมูล (WHERE clause) หรือการ Join ข้อมูลด้วยคอลัมน์ที่ยังไม่มี Index การขาด Index ในจุดนี้จะบังคับให้ PostgreSQL ทำการ Full Table Scan ซึ่งช้ากว่าการใช้ Index อย่างมาก

วิธีที่ดีที่สุดในการค้นหาคือการใช้คำสั่ง EXPLAIN ANALYZE กับ Query ที่ทำงานช้า เพื่อดูว่า Query นั้นมีการใช้การสแกนแบบ Seq Scan (Sequential Scan) ในจุดที่ควรจะใช้ Index หรือไม่

SQL

EXPLAIN ANALYZE
SELECT * FROM users WHERE last_login = '2023-01-01';

หากผลลัพธ์แสดง Seq Scan บนตารางขนาดใหญ่ แสดงว่าควรพิจารณาเพิ่ม Index บนคอลัมน์ last_login

✅ บทสรุป: วงจรการดูแล Index

การจัดการ Index ไม่ใช่กิจกรรมที่ทำครั้งเดียวจบ แต่เป็นวงจรของการบำรุงรักษาอย่างต่อเนื่อง (Maintenance Cycle) DBA หรือ System Architect ควรตั้งตารางการตรวจสอบ Index อย่างสม่ำเสมอ โดยเริ่มจากการตรวจสอบ Unused Index เพื่อทำความสะอาด จากนั้นวิเคราะห์ Query ที่ช้าด้วย EXPLAIN ANALYZE เพื่อหา Missing Index และสุดท้ายคือการตรวจสอบความซ้ำซ้อนเพื่อรักษาประสิทธิภาพสูงสุดของ PostgreSQL