PlusMagi's Blog By Pitt Phunsanit Backend,Database 7. Indexing & Query Performance Optimization (Secondary Indexes, Compound Indexes, TTL Indexes)

7. Indexing & Query Performance Optimization (Secondary Indexes, Compound Indexes, TTL Indexes)

ในโลกของการพัฒนาแอปพลิเคชันที่ข้อมูลเติบโตอย่างก้าวกระโดด การจัดการกับปริมาณข้อมูลมหาศาลกลายเป็นความท้าทายหลักสำหรับนักพัฒนาระบบฐานข้อมูล ประสิทธิภาพในการเรียกใช้ข้อมูล (Query Performance) จึงไม่ใช่แค่ฟีเจอร์เสริม แต่เป็นหัวใจสำคัญที่กำหนดประสบการณ์ผู้ใช้งานและความสามารถในการขยายตัวของระบบ

เมื่อ Query ใช้เวลานานเกินไป ระบบทั้งหมดก็จะติดขัดและส่งผลกระทบต่อธุรกิจโดยตรง การทำความเข้าใจกลไกเบื้องหลังการดึงข้อมูลจึงเป็นทักษะที่ขาดไม่ได้สำหรับวิศวกรฐานข้อมูลทุกคน โดยเฉพาะอย่างยิ่งเมื่อใช้ PostgreSQL ซึ่งเป็นระบบฐานข้อมูลที่ทรงพลังและยืดหยุ่น

หลักการเพิ่มประสิทธิภาพด้วย Indexing ใน PostgreSQL

หัวใจของการเพิ่มประสิทธิภาพฐานข้อมูลคือการลดจำนวนแถว (Rows) ที่ระบบต้องสแกนเพื่อหาคำตอบ การทำ Indexing เปรียบเสมือนกับการสร้างดัชนีในหนังสือเล่มหนา แทนที่จะอ่านทีละหน้าตั้งแต่ต้นจนจบ ระบบจะสามารถกระโดดไปยังหน้าที่ต้องการได้ทันที โดย PostgreSQL รองรับ Index หลายประเภทที่ออกแบบมาเพื่อแก้ปัญหาเฉพาะด้าน

1. Secondary Indexes (ดัชนีรอง)

Secondary Index คือการสร้างดัชนีบนคอลัมน์ที่ไม่ใช่ Primary Key โดยเฉพาะอย่างยิ่งเมื่อเราต้องค้นหาข้อมูลจากมุมมองอื่นที่ไม่ใช่คีย์หลัก การสร้างดัชนีเหล่านี้ช่วยให้ Query สามารถค้นหาข้อมูลได้อย่างรวดเร็วโดยไม่ต้องสแกนตารางทั้งหมด

ตัวอย่างการใช้งาน PostgreSQL:

SQL

-- สมมติว่าเรามีตาราง 'products' ที่มีคอลัมน์ 'category'

SQL

CREATE TABLE products (

SQL

product_id SERIAL PRIMARY KEY,

SQL

product_name VARCHAR(100),

SQL

category VARCHAR(50),

SQL

price NUMERIC

SQL

);

SQL

-- สร้าง Secondary Index บนคอลัมน์ 'category'

SQL

CREATE INDEX idx_product_category ON products (category);

2. Compound Indexes (ดัชนีรวมคอลัมน์)

Compound Index คือการรวมหลายคอลัมน์เข้าด้วยกันเพื่อสร้างดัชนีเดียว ซึ่งมีประสิทธิภาพสูงมากเมื่อ Query ของเรามีการกรองข้อมูล (WHERE clause) หรือจัดเรียงข้อมูล (ORDER BY) โดยอ้างอิงจากคอลัมน์เหล่านั้น ลำดับของคอลัมน์ใน Compound Index มีความสำคัญอย่างยิ่ง เพราะ PostgreSQL จะใช้ดัชนีนี้ได้ดีที่สุดเมื่อ Query ใช้คอลัมน์ตามลำดับที่กำหนด

ตัวอย่างการใช้งาน PostgreSQL:

SQL

-- สร้าง Compound Index บน (category, product_name)

SQL

CREATE INDEX idx_product_search ON products (category, product_name);

การใช้ดัชนีนี้จะเร็วกว่าการสร้างดัชนีแยกกันสองตัว หาก Query ของเรามีการกรองทั้งสองคอลัมน์

3. TTL Indexes (Time To Live)

TTL Indexes ไม่ใช่ประเภท Index ที่มีอยู่ใน PostgreSQL โดยตรงเหมือน MongoDB แต่เป็นแนวคิดในการจัดการวงจรชีวิตของข้อมูล (Data Lifecycle Management) คือการกำหนดว่าข้อมูลแถวใดควรถูกลบออกเมื่อเวลาผ่านไป การจำลอง TTL ใน PostgreSQL มักทำโดยการเพิ่มคอลัมน์ Timestamp และใช้กลไกการลบข้อมูลตามเวลา

แนวทางการจัดการ TTL ใน PostgreSQL:

  1. เพิ่มคอลัมน์เวลา: เพิ่มคอลัมน์เช่น `created_at` หรือ `expires_at`
  2. ใช้ Scheduled Job: ใช้ Cron Job หรือ pg_cron เพื่อรันคำสั่งลบข้อมูลที่เกินอายุ

SQL

-- ตัวอย่างการลบข้อมูลที่เกิน 30 วัน (TTL)

SQL

DELETE FROM products WHERE created_at < NOW() - INTERVAL '30 days';

บทสรุป: ข้อควรระวังในการทำ Indexing

การทำ Indexing คืออาวุธที่ทรงพลังที่สุดในการเพิ่มประสิทธิภาพ แต่ก็มีข้อควรระวังเช่นกัน การสร้าง Index มากเกินไป (Over-indexing) จะทำให้การเขียนข้อมูล (INSERT/UPDATE/DELETE) ช้าลง เพราะทุกครั้งที่มีการเปลี่ยนแปลงข้อมูล ฐานข้อมูลจะต้องอัปเดต Index เหล่านั้นด้วย ดังนั้น นักพัฒนาระบบที่ดีต้องวิเคราะห์ Query Plan อย่างละเอียด (ใช้คำสั่ง EXPLAIN ANALYZE) เพื่อให้แน่ใจว่า Index ที่สร้างขึ้นนั้นถูกใช้งานจริงและคุ้มค่าต่อการบำรุงรักษา

Exit mobile version