慢查詢與缺失索引是最容易發現、解決、收益最大的問題。MySQL 5.0+ 內建慢查詢日誌功能,零成本啟用。
mysql> SHOW VARIABLES LIKE 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
mysql> SET GLOBAL long_query_time = 1; -- 超過 1 秒即記錄
mysql> SHOW VARIABLES LIKE 'slow%';
+---------------------+---------------+
| Variable_name | Value |
+---------------------+---------------+
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /tmp/slow.log |
+---------------------+---------------+
mysql> SET GLOBAL slow_query_log = 'ON'; -- 立即生效
/etc/my.cnf[mysqld]
long_query_time = 1
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
# 可選:記錄未使用索引的查詢
log_queries_not_using_indexes = 1
mysqldumpslow -s t -t 10 /var/log/mysql/slow.logpt-query-digest /var/log/mysql/slow.log --limit 20 --filter '\$event->{Query_time} > 2'EXPLAIN,檢查 type、key、rows、Extra| EXPLAIN 特徵 | 典型原因 | 解決方向 |
|---|---|---|
type=ALL | 全表掃描 | 加 WHERE 條件索引、覆蓋索引 |
key=NULL | 無可用索引 | 建立組合索引、調整欄位順序 |
rows 極大 | 掃描行數過多 | 分區表、歸檔冷數據、增加過濾條件 |
Using temporary; Using filesort | 臨時表+排序 | 優化 ORDER BY/GROUP BY、增加索引順序 |
Using where 但 rows 仍大 | 索引選擇性低 | 重建高選擇性索引、使用強制索引 |
# logrotate 配置
/var/log/mysql/slow.log {
daily
rotate 30
compress
missingok
notifempty
create 640 mysql mysql
sharedscripts
postrotate
mysqladmin flush-logs
endscript
}
慢查詢日誌是資料庫健康體檢報告,持續收集、定期分析、持續優化,才是效能穩定的根本之道。