Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

เปิด Slow Query Log ใน MySQL โดยไม่ต้อง Restart

ใช้ 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