MySQL Slow Query Log — วิเคราะห์ Query ช้า

เมื่อแอปพลิเคชันเริ่มตอบสนองช้าลง หนึ่งในขั้นตอนแรกที่ DBA และนักพัฒนาควรทำคือตรวจสอบว่ามีคำสั่ง SQL ใดบ้างที่ใช้เวลานานเกินไป MySQL มีฟีเจอร์ในตัวที่ช่วยบันทึกคำสั่งเหล่านี้โดยอัตโนมัติ นั่นคือ Slow Query Log ซึ่งจะจับทุกคำสั่งที่ใช้เวลาเกินค่าที่กำหนดไว้ ช่วยให้ค้นหาจุดคอขวดได้อย่างตรงจุดโดยไม่ต้องเดา

บทความนี้จะอธิบายวิธีเปิดใช้งานและตั้งค่า Slow Query Log อย่างละเอียด ตั้งแต่การกำหนดค่าใน Configuration File, การเปิดใช้งานแบบ Runtime, การอ่านและตีความ Log File, การวิเคราะห์ด้วยเครื่องมืออย่าง mysqldumpslow และ pt-query-digest ไปจนถึงแนวทางปฏิบัติที่ดีในการจัดการ Log บน Production Server

Slow Query Log คืออะไร

Slow Query Log เป็นระบบบันทึกที่ MySQL สร้างขึ้นเพื่อจับคำสั่ง SQL ที่ใช้เวลาดำเนินการนานเกินค่า Threshold ที่กำหนดไว้ในตัวแปร long_query_time เมื่อเปิดใช้งาน ระบบจัดการฐานข้อมูลจะเขียนรายละเอียดของคำสั่งเหล่านี้ลงไฟล์ Log โดยอัตโนมัติ รวมถึงเวลาที่ใช้ จำนวน Row ที่ตรวจสอบ และจำนวน Row ที่ส่งกลับ

ฟีเจอร์นี้ต่างจากการใช้ EXPLAIN ตรงที่ไม่ต้องเลือกคำสั่งมาวิเคราะห์ทีละตัว แต่ระบบจะจับทุกคำสั่งที่ช้าให้อัตโนมัติ เหมาะสำหรับการ Monitor ระบบ Production ที่มีคำสั่งจำนวนมากและไม่สามารถตรวจสอบทีละรายการได้

เปิดใช้งานผ่าน Configuration File

วิธีที่แนะนำสำหรับ Production คือการตั้งค่าใน Configuration File เพื่อให้คงอยู่แม้ Restart Service ให้เปิดไฟล์ my.cnf (หรือ mysqld.cnf บน Ubuntu) แล้วเพิ่มการตั้งค่าใน Section [mysqld]

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
min_examined_row_limit = 100

slow_query_log = 1 — เปิดใช้งานระบบบันทึกคำสั่งที่ช้า ค่า 0 คือปิด

slow_query_log_file — กำหนดพาธของไฟล์บันทึก หากไม่ระบุ ระบบจะใช้ชื่อ hostname-slow.log ใน Data Directory

long_query_time = 1 — คำสั่งที่ใช้เวลาเกิน 1 วินาทีจะถูกบันทึก ค่า Default คือ 10 วินาที ซึ่งสูงเกินไปสำหรับเว็บแอปพลิเคชันส่วนใหญ่ แนะนำให้เริ่มที่ 1 วินาทีแล้วค่อยปรับตามความเหมาะสม ค่านี้รองรับทศนิยมได้ เช่น 0.5 สำหรับครึ่งวินาที

log_queries_not_using_indexes = 1 — บันทึกคำสั่งที่ไม่ได้ใช้ดัชนีด้วย แม้จะทำงานเสร็จเร็ว ช่วยค้นหาคำสั่งที่อาจช้าในอนาคตเมื่อข้อมูลเพิ่มขึ้น

min_examined_row_limit = 100 — บันทึกเฉพาะคำสั่งที่ตรวจสอบมากกว่า 100 Row ช่วยกรอง Noise จากคำสั่งเล็ก ๆ ที่ไม่ใช้ดัชนีแต่ไม่ส่งผลกระทบ

หลังแก้ไข Configuration ให้ Restart Service เพื่อให้มีผล

sudo systemctl restart mysqld

เปิดใช้งานแบบ Runtime ไม่ต้อง Restart

หากไม่สะดวก Restart Service สามารถเปิดใช้งานแบบ Runtime ได้ทันทีผ่านคำสั่ง SET GLOBAL การตั้งค่าแบบนี้จะมีผลจนกว่าจะ Restart Service

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
SET GLOBAL log_queries_not_using_indexes = 'ON';
SET GLOBAL min_examined_row_limit = 100;

ตรวจสอบว่าการตั้งค่ามีผลแล้ว

SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';

ข้อควรระวังสำหรับ Connection ที่เปิดอยู่ก่อน — ค่า long_query_time ที่เปลี่ยนผ่าน SET GLOBAL จะมีผลเฉพาะ Connection ใหม่เท่านั้น Connection เดิมที่เปิดอยู่แล้วยังคงใช้ค่าเก่า หากต้องการให้มีผลทันทีใน Session ปัจจุบัน ต้องรัน SET SESSION long_query_time = 1 เพิ่ม

ตั้งค่า long_query_time ที่เหมาะสม

การเลือกค่า Threshold ที่เหมาะสมขึ้นอยู่กับลักษณะการใช้งาน ถ้าตั้งค่าต่ำเกินไปไฟล์บันทึกจะมีขนาดใหญ่มากจนยากต่อการวิเคราะห์ ถ้าสูงเกินไปจะพลาดคำสั่งที่ค่อนข้างช้าแต่ยังไม่ถึง Threshold

สำหรับเว็บแอปพลิเคชันทั่วไปที่ผู้ใช้คาดหวังเวลาตอบสนองเร็ว แนะนำให้เริ่มที่ 1 วินาที สำหรับระบบ API ที่ต้องการ Latency ต่ำ อาจตั้งค่าที่ 0.5 วินาทีหรือต่ำกว่า ส่วนระบบ Batch Processing หรือ Reporting ที่คำสั่งยาวเป็นเรื่องปกติ อาจตั้งที่ 5-10 วินาที

กลยุทธ์ที่ดีคือเริ่มจากค่าต่ำ เช่น 0.5 วินาที เพื่อจับภาพรวมทั้งหมดก่อน จากนั้นค่อยปรับขึ้นเมื่อแก้ไขคำสั่งที่ช้าที่สุดแล้ว วิธีนี้ช่วยให้มั่นใจว่าไม่พลาดปัญหาสำคัญในช่วงเริ่มต้น

อ่านและตีความไฟล์บันทึก

ไฟล์ที่บันทึกได้จะมีรูปแบบดังนี้สำหรับแต่ละคำสั่ง

# Time: 2025-01-15T08:23:45.123456Z
# User@Host: appuser[appuser] @ localhost []  Id: 12345
# Query_time: 3.456789  Lock_time: 0.000123  Rows_sent: 150  Rows_examined: 1500000
SET timestamp=1736929425;
SELECT o.order_id, c.name, p.product_name
FROM orders o
JOIN customers c ON o.customer_id = c.id
JOIN products p ON o.product_id = p.id
WHERE o.created_at BETWEEN '2024-01-01' AND '2024-12-31'
ORDER BY o.created_at DESC;

Time — เวลาที่คำสั่งทำงานเสร็จ ไม่ใช่เวลาเริ่มต้น

User@Host — ผู้ใช้และ Host ที่ส่งคำสั่ง ช่วยระบุว่าคำสั่งมาจากแอปพลิเคชันใด

Query_time — เวลาที่ใช้ดำเนินการ (หน่วยวินาที) นี่คือตัวเลขสำคัญที่สุด คำสั่งในตัวอย่างใช้เวลา 3.46 วินาที

Lock_time — เวลาที่รอ Lock ถ้าค่านี้สูง แสดงว่ามีปัญหา Contention ไม่ใช่ปัญหา Query Optimization

Rows_sent — จำนวน Row ที่ส่งกลับให้ Client

Rows_examined — จำนวน Row ที่ระบบต้อง Scan ทั้งหมด ถ้าค่านี้สูงกว่า Rows_sent มาก แสดงว่าคำสั่งนี้ Scan ข้อมูลเกินจำเป็น ในตัวอย่าง Scan 1.5 ล้าน Row แต่ส่งกลับเพียง 150 Row ซึ่งเป็นสัญญาณชัดเจนว่าขาดดัชนีที่เหมาะสม

วิเคราะห์ด้วย mysqldumpslow

เมื่อไฟล์บันทึกมีคำสั่งจำนวนมาก การอ่านทีละรายการไม่เหมาะสม mysqldumpslow เป็นเครื่องมือที่มากับ MySQL ช่วยสรุปและจัดกลุ่มคำสั่งที่คล้ายกัน โดยแทนที่ค่าตัวเลขและ String ด้วย N และ S ตามลำดับ ทำให้เห็นรูปแบบคำสั่งที่เป็นปัญหาได้ชัดเจน

# แสดง 10 คำสั่งที่ช้าที่สุด เรียงตามเวลารวม
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

# แสดง 10 คำสั่งที่ถูกเรียกบ่อยที่สุด
mysqldumpslow -s c -t 10 /var/log/mysql/slow.log

# แสดง 10 คำสั่งที่ Scan Row มากที่สุด
mysqldumpslow -s r -t 10 /var/log/mysql/slow.log

# แสดงเฉพาะคำสั่งที่เกี่ยวกับตาราง orders
mysqldumpslow -s t -t 10 -g "orders" /var/log/mysql/slow.log

ตัวเลือก -s กำหนดวิธีเรียงลำดับ โดย t คือเรียงตามเวลารวม (Total Time), c คือเรียงตามจำนวนครั้ง (Count), r คือเรียงตามจำนวน Row ที่ส่งกลับ, at คือเรียงตามเวลาเฉลี่ย (Average Time) และ ar คือเรียงตามจำนวน Row เฉลี่ย ส่วน -t กำหนดจำนวนผลลัพธ์ที่ต้องการแสดง

ตัวอย่างผลลัพธ์จาก mysqldumpslow

Count: 482  Time=2.35s (1132s)  Lock=0.00s (0s)  Rows=150.2 (72396)
  SELECT o.order_id, c.name FROM orders o JOIN customers c ON o.customer_id = c.id WHERE o.created_at BETWEEN 'S' AND 'S' ORDER BY o.created_at DESC

Count: 156  Time=1.87s (291s)  Lock=0.00s (0s)  Rows=1.0 (156)
  SELECT * FROM products WHERE product_name LIKE 'S'

จากผลลัพธ์ คำสั่งแรกถูกเรียก 482 ครั้ง ใช้เวลาเฉลี่ย 2.35 วินาทีต่อครั้ง รวมเวลาทั้งหมด 1,132 วินาที นี่คือคำสั่งที่ควรปรับปรุงก่อนเพราะส่งผลกระทบมากที่สุด ส่วนคำสั่งที่สองแม้เรียกน้อยกว่าแต่ Pattern การใช้ LIKE อาจเป็นสัญญาณว่าขาด Full-Text Index

วิเคราะห์เชิงลึกด้วย pt-query-digest

pt-query-digest เป็นเครื่องมือจาก Percona Toolkit ที่ให้รายงานละเอียดกว่า mysqldumpslow มาก รวมถึง Response Time Distribution, Histogram และสถิติเชิงลึกของแต่ละกลุ่มคำสั่ง เป็นเครื่องมือมาตรฐานที่ DBA มืออาชีพใช้กันอย่างแพร่หลาย

ติดตั้ง Percona Toolkit

บน Ubuntu/Debian

sudo apt install percona-toolkit -y

บน CentOS/RHEL/AlmaLinux

sudo yum install percona-toolkit -y

รันการวิเคราะห์

# วิเคราะห์ไฟล์ Log ทั้งหมด
pt-query-digest /var/log/mysql/slow.log

# วิเคราะห์เฉพาะช่วงเวลาที่กำหนด
pt-query-digest /var/log/mysql/slow.log --since '2025-01-15 00:00:00' --until '2025-01-15 23:59:59'

# บันทึกผลลัพธ์เป็นไฟล์
pt-query-digest /var/log/mysql/slow.log > /tmp/slow_report.txt

# วิเคราะห์เฉพาะคำสั่งที่เกี่ยวกับ Database เฉพาะ
pt-query-digest /var/log/mysql/slow.log --filter '$event->{db} eq "myapp_db"'

ตีความรายงาน pt-query-digest

รายงานแบ่งเป็น 3 ส่วนหลัก ส่วนแรกคือ Overall Summary ที่แสดงภาพรวมของคำสั่งทั้งหมด

# Overall: 2.50k total, 45 unique, 1.04 QPS, 1.25x concurrency
# Time range: 2025-01-15T00:00:00 to 2025-01-15T23:59:59
# Attribute     total    min     max     avg     95%    stddev   median
# Exec time     3024s   100ms   45s     1s      5s     2s       500ms
# Lock time     12s     0       2s      5ms     1ms    50ms     0
# Rows sent     1.25M   0       50.00k  500     5.00k  2.50k    10
# Rows examine  850.5M  0       15.00M  340.2k  2.00M  1.50M    1.00k

ส่วนนี้บอกว่ามีคำสั่งทั้งหมด 2,500 รายการ จาก 45 รูปแบบที่ไม่ซ้ำกัน ใช้เวลารวม 3,024 วินาที ค่า 95% อยู่ที่ 5 วินาที หมายความว่า 95% ของคำสั่งใช้เวลาไม่เกิน 5 วินาที

ส่วนที่สองคือ Profile ที่จัดอันดับกลุ่มคำสั่งตามผลกระทบ

# Profile
# Rank Query ID                        Response time  Calls  R/Call  V/M
# ==== =============================== ============== ====== ======= ====
#    1 0xABC123DEF456 SELECT orders...  1200.5 39.7%     482  2.4908  1.25
#    2 0x789GHI012JKL SELECT products.. 291.7  9.6%      156  1.8699  0.85
#    3 0xMNO345PQR678 UPDATE inventory. 245.3  8.1%       89  2.7562  2.10

Rank 1 คือคำสั่งที่ส่งผลกระทบมากที่สุด ใช้เวลารวม 39.7% ของเวลาทั้งหมด นี่คือเป้าหมายแรกที่ควรปรับปรุง คอลัมน์ V/M (Variance-to-Mean Ratio) บอกความสม่ำเสมอ ถ้าค่าสูง แปลว่าเวลาแต่ละครั้งต่างกันมาก อาจเกิดจาก Lock Contention หรือ Cache Miss

ส่วนที่สามคือ Query Detail ที่แสดงรายละเอียดของแต่ละกลุ่มคำสั่ง รวมถึง Histogram ของเวลา, ตัวอย่างคำสั่งจริง และ EXPLAIN Plan (ถ้ากำหนด –explain option ไว้)

บันทึก Log ลง Table แทน File

นอกจากเขียนลงไฟล์ MySQL ยังสามารถบันทึกข้อมูลลงตาราง mysql.slow_log ได้ ซึ่งมีข้อดีคือสามารถใช้คำสั่ง SQL วิเคราะห์ข้อมูลได้โดยตรง

SET GLOBAL log_output = 'TABLE';
SET GLOBAL slow_query_log = 'ON';

เมื่อตั้งค่าแล้ว สามารถ Query ข้อมูลจากตารางได้

-- ดูคำสั่งที่ช้าที่สุด 10 อันดับ
SELECT query_time, lock_time, rows_sent, rows_examined,
       CONVERT(sql_text USING utf8) AS sql_text
FROM mysql.slow_log
ORDER BY query_time DESC
LIMIT 10;

-- นับจำนวนคำสั่งช้าแยกตาม User
SELECT user_host, COUNT(*) AS slow_count,
       AVG(query_time) AS avg_time
FROM mysql.slow_log
GROUP BY user_host
ORDER BY slow_count DESC;

-- ดูคำสั่งช้าในช่วง 1 ชั่วโมงที่ผ่านมา
SELECT start_time, query_time, rows_examined,
       CONVERT(sql_text USING utf8) AS sql_text
FROM mysql.slow_log
WHERE start_time >= NOW() - INTERVAL 1 HOUR
ORDER BY query_time DESC;

ข้อเสียของการบันทึกลง Table คือมี Overhead สูงกว่าการเขียนลงไฟล์ เพราะต้อง INSERT ลงตารางทุกครั้ง อาจกระทบ Performance บน Production ที่มี Load สูง แนะนำให้ใช้ log_output = ‘FILE’ เป็นค่า Default และเปลี่ยนเป็น TABLE เมื่อต้องการวิเคราะห์เฉพาะช่วงเวลาสั้น ๆ

หากต้องการบันทึกทั้งสองแบบพร้อมกัน

SET GLOBAL log_output = 'FILE,TABLE';

จัดการขนาดไฟล์บันทึกบน Production

บน Production Server ที่มี Traffic สูง ไฟล์บันทึกอาจโตเร็วมากจนกินพื้นที่ดิสก์ การจัดการขนาดไฟล์จึงสำคัญ วิธีที่ปลอดภัยคือใช้ Log Rotation

Rotate ด้วย Flush Slow Logs

MySQL รองรับการ Rotate ไฟล์บันทึกโดยไม่ต้องหยุด Service ทำได้ด้วยการย้ายไฟล์เก่าแล้วสั่งให้ระบบสร้างไฟล์ใหม่

# ย้ายไฟล์ Log เก่า
sudo mv /var/log/mysql/slow.log /var/log/mysql/slow.log.$(date +%Y%m%d)

# สั่งให้ MySQL สร้างไฟล์ใหม่
mysqladmin -u root -p flush-logs

หรือรันจากภายใน MySQL Shell

FLUSH SLOW LOGS;

ตั้งค่า logrotate อัตโนมัติ

สร้างไฟล์ Configuration สำหรับ logrotate เพื่อให้ Rotate อัตโนมัติทุกวัน

sudo nano /etc/logrotate.d/mysql-slow

เพิ่มเนื้อหาดังนี้

/var/log/mysql/slow.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 640 mysql mysql
    postrotate
        /usr/bin/mysqladmin -u root -p'YourPassword' flush-logs
    endscript
}

การตั้งค่านี้จะ Rotate ไฟล์ทุกวัน เก็บไว้ 7 วัน บีบอัดไฟล์เก่า และสั่ง Flush อัตโนมัติหลัง Rotate สำหรับความปลอดภัยที่ดีกว่า แนะนำใช้ mysql_config_editor เก็บรหัสผ่านแทนการใส่ใน Script โดยตรง

ล้างข้อมูลใน slow_log Table

หากใช้ log_output แบบ TABLE ต้องล้างข้อมูลเก่าเป็นประจำเช่นกัน

-- ปิด Log ชั่วคราว
SET GLOBAL slow_query_log = 'OFF';

-- ล้างข้อมูลเก่ากว่า 7 วัน
DELETE FROM mysql.slow_log WHERE start_time < NOW() - INTERVAL 7 DAY;

-- หรือล้างทั้งหมด
TRUNCATE TABLE mysql.slow_log;

-- เปิด Log กลับ
SET GLOBAL slow_query_log = 'ON';

กรณีศึกษา — วิเคราะห์และแก้ไขคำสั่งช้า

สมมติว่าพบคำสั่งนี้ในไฟล์บันทึกที่ใช้เวลา 4.5 วินาที

# Query_time: 4.521234  Lock_time: 0.000089  Rows_sent: 25  Rows_examined: 2350000
SELECT o.order_id, o.total, c.email
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE o.status = 'completed'
  AND o.created_at >= '2024-06-01'
ORDER BY o.created_at DESC
LIMIT 25;

ขั้นตอนแรก วิเคราะห์ด้วย EXPLAIN

EXPLAIN SELECT o.order_id, o.total, c.email
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE o.status = 'completed'
  AND o.created_at >= '2024-06-01'
ORDER BY o.created_at DESC
LIMIT 25;

สมมติว่า EXPLAIN แสดง type=ALL สำหรับตาราง orders และ rows=2350000 แปลว่ากำลัง Full Table Scan ทั้งตาราง ปัญหาคือไม่มีดัชนีที่ครอบคลุม WHERE clause

ขั้นตอนที่สอง สร้าง Composite Index ที่เหมาะสม

ALTER TABLE orders ADD INDEX idx_status_created (status, created_at);

ดัชนีนี้ช่วยให้ระบบกรอง status = ‘completed’ ก่อน จากนั้นใช้ created_at ในดัชนีเดียวกันเพื่อกรองช่วงวันที่และเรียงลำดับ ทำให้ไม่ต้อง Scan ทั้งตาราง

ขั้นตอนที่สาม ตรวจสอบผลลัพธ์ด้วย EXPLAIN อีกครั้ง

EXPLAIN SELECT o.order_id, o.total, c.email
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE o.status = 'completed'
  AND o.created_at >= '2024-06-01'
ORDER BY o.created_at DESC
LIMIT 25;

หลังเพิ่มดัชนี type ควรเปลี่ยนเป็น ref หรือ range และ rows ลดลงอย่างมาก เวลาดำเนินการควรลดจาก 4.5 วินาทีเหลือไม่กี่มิลลิวินาที

ตัวชี้วัดสำคัญที่ควรติดตาม

นอกจากดูไฟล์บันทึกโดยตรง ควรติดตามตัวชี้วัดระดับ Server เพื่อประเมินสุขภาพโดยรวม

-- จำนวนคำสั่งช้าสะสมตั้งแต่ Start Server
SHOW GLOBAL STATUS LIKE 'Slow_queries';

-- อัตราส่วนคำสั่งช้าต่อคำสั่งทั้งหมด
SELECT
  (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Slow_queries') AS slow,
  (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Questions') AS total;

ค่า Slow_queries ที่เพิ่มขึ้นเร็วผิดปกติเป็นสัญญาณเตือนว่ามีปัญหาใหม่เกิดขึ้น ควรตั้ง Alert เมื่ออัตราส่วนเกินค่าที่กำหนด เช่น ถ้าคำสั่งช้าเกิน 1% ของคำสั่งทั้งหมดในช่วง 5 นาที

แนวปฏิบัติที่ดีสำหรับ Production

เปิดใช้งานเสมอ — Slow Query Log มี Overhead ต่ำมาก แนะนำให้เปิดไว้ตลอดบน Production ไม่ต้องเปิดเฉพาะตอนมีปัญหา การเปิดไว้ล่วงหน้าทำให้มีข้อมูลพร้อมวิเคราะห์ทันทีเมื่อเกิดปัญหา

ตั้ง logrotate ตั้งแต่วันแรก — อย่ารอจนดิสก์เต็ม ตั้ง logrotate ให้ Rotate ทุกวันและเก็บไว้ 7-14 วัน

วิเคราะห์เป็นประจำ — กำหนดตารางวิเคราะห์ไฟล์บันทึกอย่างน้อยสัปดาห์ละครั้ง ใช้ pt-query-digest สร้างรายงาน แล้วเปรียบเทียบกับสัปดาห์ก่อนเพื่อดูแนวโน้ม

ใช้ร่วมกับ Performance Schema — Slow Query Log จับเฉพาะคำสั่งที่ช้ากว่า Threshold แต่ Performance Schema ให้ข้อมูลสถิติรวมของทุกคำสั่ง การใช้ร่วมกันให้ภาพที่สมบูรณ์กว่า

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

สรุป

Slow Query Log เป็นเครื่องมือพื้นฐานที่ทรงพลังในการค้นหาคำสั่ง SQL ที่ทำงานช้า การเปิดใช้งานทำได้ง่ายทั้งผ่าน Configuration File และแบบ Runtime สิ่งสำคัญคือการตั้งค่า long_query_time ให้เหมาะสมกับลักษณะงาน การใช้เครื่องมือวิเคราะห์อย่าง mysqldumpslow สำหรับภาพรวมเบื้องต้นและ pt-query-digest สำหรับการวิเคราะห์เชิงลึก และการจัดการขนาดไฟล์ด้วย logrotate เมื่อวิเคราะห์แล้วพบคำสั่งที่ช้า ให้ใช้ EXPLAIN ตรวจสอบ Execution Plan แล้วแก้ไขด้วยการเพิ่มดัชนีหรือปรับโครงสร้างคำสั่งให้มีประสิทธิภาพ

แนะนำบริการ DE

การวิเคราะห์และปรับแต่งคำสั่งฐานข้อมูลที่ช้าต้องอาศัยเซิร์ฟเวอร์ที่ให้ Root Access เต็มรูปแบบเพื่อเข้าถึง Configuration File และไฟล์บันทึกได้โดยตรง Cloud VPS ของ DE เปิดให้ปรับแต่งทุกอย่างได้อิสระ มาพร้อม SSD Storage ที่ให้ IOPS สูง ช่วยให้ระบบจัดการฐานข้อมูลทำงานได้เต็มประสิทธิภาพ

สำหรับผู้ที่ต้องการฐานข้อมูลพร้อมใช้งานโดยไม่ต้องตั้งค่าเอง Cloud Hosting ของ DE มาพร้อมระบบจัดการฐานข้อมูลและ phpMyAdmin ที่ตั้งค่าให้เรียบร้อย เหมาะกับเว็บแอปพลิเคชันที่ต้องการความสะดวกในการจัดการข้อมูล