หา Slow Query MySQL ผ่าน phpMyAdmin แก้ยังไง

เว็บโหลดช้าอาจไม่ใช่ที่ Hosting แต่เป็น Query ฐานข้อมูลที่ไม่มี Index

หา Slow Query MySQL ผ่าน phpMyAdmin แก้ยังไง 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:

วิธีเปิด Slow Query Log ใน cPanel

ขั้นตอน:

  1. Login เข้า cPanel https://yourdomain.com:2083
  2. ไปยัง MySQL Databases
  3. ลงมาหา Remote MySQL หรือ MySQL Tools (ขึ้นอยู่กับ cPanel Version)
  4. หา Option Enable Slow Query Log หรือ MySQL Slow Query Log
  5. เลือก Threshold (ค่า Long_query_time) ซึ่งหมายถึง "Query ที่ใช้เวลามากกว่า X วินาที จึงถือว่า Slow"
    • ค่าเริ่มต้นปกติ: 2 วินาที
    • ถ้าต้องการดูเพียง Query ที่ช้าจริง ๆ ให้ตั้งเป็น 1-2 วินาที
    • ถ้าต้องการดูรายละเอียดมากขึ้น (รวมถึง Query ที่ช้าเล็กน้อย) ให้ตั้งเป็น 0.5 วินาที
  6. คลิก Enable หรือ Save

หลังจากเปิด Slow Query Log แล้ว ให้รอ 1-2 ชั่วโมงเพื่อให้ MySQL บันทึก Query ที่ช้า หลังจากนั้นจึงดูรายละเอียดได้

ดู Slow Query Log ใน phpMyAdmin

หลังจากเปิด Slow Query Log ได้มี 1-2 ชั่วโมง วิธีดูรายละเอียด Query ที่ช้า:

  1. Login phpMyAdmin ผ่าน cPanel (Databases > phpMyAdmin)
  2. คลิก Status ด้านบน
  3. ไปยัง Tab Slow Query Log (อาจต้องเลือกจาก Dropdown menu ด้านบน)
  4. 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

วิธีแก้:

  1. เข้า phpMyAdmin > เลือก Database > เลือก Table (เช่น wp_posts)
  2. ไปยัง Tab Indexes
  3. ไม่เห็น Index สำหรับ Column post_author ให้คลิก Create an index
  4. ใส่ Column Name: post_author
  5. ใส่ Index name: idx_post_author (ตั้งชื่อให้มีความหมาย)
  6. เลือก Index Type: BTREE (ปกติไป)
  7. คลิก 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;
Tip: ไม่ควรเพิ่ม Index ให้หมดทุก Column เพราะจะทำให้การ INSERT/UPDATE ช้าลงแทน Index ควรจำกัดเฉพาะ Column ที่มักใช้ใน WHERE Clause หรือ JOIN Condition เท่านั้น

ตรวจสอบว่า 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" ควรลดลง
Tip: ถ้าใช้ WordPress ลอง Plugin ชื่อ "Query Monitor" เพื่อดู Query Time ทุกครั้งที่เลื่อนดูหน้าเว็บ พูดได้ว่า Plugin นี้ช่วยให้เห็น Slow Query ได้รวดเร็วขึ้น (ใช้เฉพาะในการ Debug ไม่ควรไว้ใน Production)

แก้ปัญหาที่พบบ่อย

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 ยังคงช้า"

อาจเกิดจาก:

วิธีแก้: ใช้ 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