MySQL
Slow Query Log คืออะไร?
Slow Query Log คือไฟล์บันทึก (Log File) ที่ MySQL เก็บไว้เพื่อบันทึก Query ที่ใช้เวลาในการประมวลผลนานเกินกว่าค่าที่กำหนด (ค่าเริ่มต้นปกติคือ 2 วินาที) ตัวอย่างเช่น Query SELECT ที่ต้องอ่านข้อมูล 1 ล้านแถว เนื่องจากไม่มี Index ที่ถูกต้อง หรือ JOIN ที่ซับซ้อน Query นี้อาจใช้เวลา 5-10 วินาที จึงจะถูกเก็บในไฟล์ Slow Query Log
ประโยชน์ของ Slow Query Log:
- หา Bottleneck — ระบุว่า Query ไหนที่ทำให้เว็บโหลดช้า
- ปรับแต่ง Database — เมื่อรู้ว่า Query ไหนช้า เราสามารถเพิ่ม Index ให้กับ Column ที่ Query นั้นใช้ได้
- ลดโหลดเซิร์ฟเวอร์ — เมื่อแก้ไข Query ช้า ๆ ทรัพยากร CPU และ Memory ของเซิร์ฟเวอร์จะลดลง
วิธีเปิด Slow Query Log ใน cPanel
ขั้นตอน:
- Login เข้า cPanel https://yourdomain.com:2083
- ไปยัง MySQL Databases
- ลงมาหา Remote MySQL หรือ MySQL Tools (ขึ้นอยู่กับ cPanel Version)
- หา Option Enable Slow Query Log หรือ MySQL Slow Query Log
- เลือก Threshold (ค่า Long_query_time) ซึ่งหมายถึง "Query ที่ใช้เวลามากกว่า X วินาที จึงถือว่า Slow"
- ค่าเริ่มต้นปกติ: 2 วินาที
- ถ้าต้องการดูเพียง Query ที่ช้าจริง ๆ ให้ตั้งเป็น 1-2 วินาที
- ถ้าต้องการดูรายละเอียดมากขึ้น (รวมถึง Query ที่ช้าเล็กน้อย) ให้ตั้งเป็น 0.5 วินาที
- คลิก Enable หรือ Save
หลังจากเปิด Slow Query Log แล้ว ให้รอ 1-2 ชั่วโมงเพื่อให้ MySQL บันทึก Query ที่ช้า หลังจากนั้นจึงดูรายละเอียดได้
ดู Slow Query Log ใน phpMyAdmin
หลังจากเปิด Slow Query Log ได้มี 1-2 ชั่วโมง วิธีดูรายละเอียด Query ที่ช้า:
- Login phpMyAdmin ผ่าน cPanel (Databases > phpMyAdmin)
- คลิก Status ด้านบน
- ไปยัง Tab Slow Query Log (อาจต้องเลือกจาก Dropdown menu ด้านบน)
- MySQL จะแสดงรายการ Query ที่ช้า พร้อมข้อมูล:
- Query Time — ใช้เวลากี่วินาที
- Lock Time — ล็อก Table นานเท่าไหร่
- Rows Examined — สแกน Row จำนวนเท่าไหร่
- Rows Sent — ส่งคืน Row จำนวนเท่าไหร่
- Query — SQL Query ตัวจริง
แนวทางแก้ไข Slow Query: เพิ่ม Index
วิธีทั่วไปที่สุดในการแก้ไข Slow Query คือการเพิ่ม Index ให้กับ Column ที่ Query นั้นใช้
การเพิ่ม Index ใน phpMyAdmin
ตัวอย่าง: Query `SELECT * FROM wp_posts WHERE post_author = 5` ช้า เพราะไม่มี Index ที่ post_author
วิธีแก้:
- เข้า phpMyAdmin > เลือก Database > เลือก Table (เช่น wp_posts)
- ไปยัง Tab Indexes
- ไม่เห็น Index สำหรับ Column post_author ให้คลิก Create an index
- ใส่ Column Name: post_author
- ใส่ Index name: idx_post_author (ตั้งชื่อให้มีความหมาย)
- เลือก Index Type: BTREE (ปกติไป)
- คลิก Go หรือ Create
หลังจากเพิ่ม Index แล้ว Query นั้นจะทำงานเร็วขึ้น
ตัวอย่าง Query Index ใน phpMyAdmin
-- 1. ดู Index ที่มีอยู่ใน Table
SHOW INDEXES FROM wp_posts;
-- 2. สร้าง Index ใหม่
ALTER TABLE wp_posts ADD INDEX idx_post_author (post_author);
-- 3. สร้าง Composite Index (Index หลาย Column พร้อมกัน)
ALTER TABLE wp_posts ADD INDEX idx_author_status (post_author, post_status);
-- 4. ลบ Index ถ้าไม่ต้องการใช้
ALTER TABLE wp_posts DROP INDEX idx_post_author;
ตรวจสอบว่า Slow Query Fix ทำงานถูกต้อง
หลังจากแก้ไข Query (เพิ่ม Index เป็นต้น) ให้ตรวจสอบว่าได้ผลจริง ๆ:
-- 1. ดู Slow Query Log ใหม่ (รอ 1-2 ชั่วโมง)
-- ใน phpMyAdmin Status > Slow Query Log
-- 2. ตรวจสอบจำนวน Query ที่ช้า
-- เทียบเปรียบระหว่าง "ก่อน" และ "หลัง" แก้ไข
-- 3. ดู Query Execution Plan เพื่อตรวจสอบว่า Index ใช้งานหรือไม่
EXPLAIN SELECT * FROM wp_posts WHERE post_author = 5;
-- ดู Column "possible_keys" และ "key" ควรแสดง Index ที่เพิ่งสร้าง
-- 4. เปรียบเทียบ Rows Examined ก่อนและหลัง
-- สำหรับ Query เดียวกัน "Rows Examined" ควรลดลง
แก้ปัญหาที่พบบ่อย
Error: "Slow Query Log ไม่ปรากฏขึ้นมา แม้รอไป 2 ชั่วโมง"
เกิดเมื่อ Database ไม่มี Query ที่ช้ากว่า Threshold ที่ตั้ง หรือ Slow Query Log ไม่เปิดขึ้นมาจริง ๆ
วิธีแก้: ตรวจสอบว่า Slow Query Log ถูก Enable หรือไม่ใน cPanel จากนั้นลองตั้ง Threshold เป็นค่าต่ำ เช่น 0.1 วินาที เพื่อให้ Query ทั่วไปก็บันทึกลงมา ทำให้เห็นว่า Slow Query Log ทำงานหรือไม่
Error: "EXPLAIN Query พูด "possible_keys" เป็น NULL"
แปลว่า MySQL ไม่สามารถหา Index ที่ใช้ได้สำหรับ Query นั้น ถ้าเพิ่ม Index ใหม่แล้ว MySQL ก็ยังไม่ใช้ เกิดจาก Column ที่ใช้ใน WHERE Clause ไม่ตรง
วิธีแก้: ตรวจสอบว่า Index ที่สร้างไปมีชื่อ Column ตรงกับ WHERE Clause หรือไม่ ลองลบ Index เก่า แล้วสร้างใหม่เพื่อให้ MySQL โหลด Index ใหม่
Error: "หลังแก้ไข Query ใน WordPress ยังคงช้า"
อาจเกิดจาก:
- WordPress Cache ยังคงเก็บผลลัพธ์เก่า → ลบ Cache ออก
- Plugin Query ยังทำงานอยู่ → ปิด Plugin ที่ยังทำ Query ช้า
- Slow Query มาจากที่อื่น เช่น wp-cron.php → ตรวจสอบ Slow Query Log ว่ามีจาก Plugin ไหน
วิธีแก้: ใช้ Plugin "Query Monitor" เพื่อระบุ Query ช้าว่ามาจาก Plugin ไหนแน่ชัด
Error: "เพิ่ม Index แล้ว INSERT/UPDATE ช้าลง"
เกิดเมื่อเพิ่ม Index มากเกินไป ทำให้ MySQL ต้องใช้ทรัพยากร Update Index ทุกครั้งที่มี INSERT/UPDATE/DELETE
วิธีแก้: ตรวจสอบ Index ที่เพิ่มไป คัดออกเฉพาะ Column ที่มีการใช้บ่อยเท่านั้น ลบ Index ที่ไม่จำเป็น
Error: "ไม่สามารถแก้ไข Table ผ่าน ALTER INDEX เพราะ Hosting ไม่อนุญาต"
บางครั้ง Shared Hosting ป้องกัน ALTER TABLE เพื่อหลีกเลี่ยงปัญหา ให้ติดต่อ Hosting Provider
วิธีแก้: ใช้ phpMyAdmin GUI แทน CLI commands ปกติ phpMyAdmin ใช้ ALTER TABLE ได้แม้ Hosting จำกัดการใช้ SSH
คำถามที่พบบ่อย
Q: Slow Query Log จำเป็นต้องเปิดไว้ตลอดเวลาหรือ?
A: ไม่จำเป็น Slow Query Log ใช้เพื่อ Debug เมื่อมี Performance Issue ให้เปิดขึ้นมา หาคนตัวผิด แล้วแก้ไข หลังจากแก้เสร็จให้ปิดออกไปเพื่อประหยัดทรัพยากร Disk Space ของเซิร์ฟเวอร์ (Slow Query Log File กินดิสก์มาก)
Q: ต้องเพิ่ม Index ให้ทุก Column ของ Table หรือ?
A: ไม่ เพิ่มเฉพาะ Column ที่มักใช้ใน WHERE Clause, JOIN Condition, ORDER BY เท่านั้น Index เกินไปจะทำให้ INSERT/UPDATE ช้าและกิน Storage มาก Primary Key (id) ตัว Table สำเร็จมี Index อยู่แล้ว ไม่ต้องเพิ่มใหม่
Q: ถ้า EXPLAIN พูด "key" เป็น "PRIMARY" หมายถึงอะไร?
A: หมายถึง MySQL ใช้ Primary Key (โดยปกติคือ id) เพื่อเข้าถึงข้อมูล ซึ่งเร็วที่สุดแล้ว ถ้ากรณีนี้ Query ยังช้า ปัญหาอาจเป็นเพราะ Query Logic ซับซ้อน หรือ Table มีข้อมูลเยอะจนเกิน หรือเซิร์ฟเวอร์ต่อสู้ไม่ไหว ไม่ใช่ปัญหา Index