ใช้ SET GLOBAL เพื่อเปิด Slow Query Log แบบ Dynamic (No Restart Required)
Enable Slow Query Log
SET GLOBAL slow_query_log = 'ON';
ตั้งค่า Threshold (เกินกี่วินาทีถือว่า Slow)
SET GLOBAL long_query_time = 2; -- 2 วินาที (Default: 10s)
-- รองรับ Microsecond (MySQL 5.1.21+)
SET GLOBAL long_query_time = 0.5; -- 0.5 วินาที = 500ms
ตั้งค่า Log File Path (Optional)
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
⚠️ ต้องมี Permission เขียนไฟล์ และอาจต้อง Restart ถ้าเปลี่ยน Path
ตรวจสอบการตั้งค่า
SHOW GLOBAL VARIABLES LIKE 'slow_query_log%';
+---------------------+--------------------------------+
| Variable_name | Value |
+---------------------+--------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /var/log/mysql/slow.log |
+---------------------+--------------------------------+
SHOW GLOBAL VARIABLES LIKE 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 2.000000 |
+-----------------+-----------+
Flush Logs (Rotate Log File)
FLUSH LOGS;
-- หรือ
FLUSH SLOW LOGS;
อ่าน Slow Query Log
# Time: 2024-01-15T10:30:45.123456Z
# User@Host: root[root] @ localhost [] Id: 123
# Query_time: 2.500000 Lock_time: 0.000100 Rows_sent: 100 Rows_examined: 10000
SET timestamp=1705312245;
SELECT * FROM large_table WHERE unindexed_col = 'value';
Analyze ด้วย mysqldumpslow (Percona Toolkit)
# Top 10 Slowest Queries
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
# Top by Rows Examined
mysqldumpslow -s r -t 10 /var/log/mysql/slow.log
# Group by Query Pattern
mysqldumpslow -s c -t 20 /var/log/mysql/slow.log
Permanent Config (my.cnf)
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1 -- Log Query ที่ไม่ใช้ Index (Optional)
log_slow_admin_statements = 1 -- Log Admin Commands (Optional)
log_slow_slave_statements = 1 -- Log Replication SQL (Optional)
⚠️ Performance Impact
- Slow Query Log เขียนไฟล์ทุก Slow Query → I/O Overhead
- ตั้ง
long_query_timeให้เหมาะสม (ไม่ต่ำเกินไป) - ใช้
log_queries_not_using_indexesระวัง Log เยอะมาก - Monitor Disk Space ของ Log Directory
Disable
SET GLOBAL slow_query_log = 'OFF';
-- หรือใน my.cnf: slow_query_log = 0