首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 慢查詢分析實戰:從開啟慢日誌到定位效能殺手

     編輯:MySQL 資料庫相關知識

為什麼慢查詢是效能優化的「最軟柿子」?

慢查詢與缺失索引是最容易發現、解決、收益最大的問題。MySQL 5.0+ 內建慢查詢日誌功能,零成本啟用。

三步開啟慢查詢日誌(動態生效,無需重啟)

1. 設定閾值:什麼算「慢」?

mysql> SHOW VARIABLES LIKE 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+

mysql> SET GLOBAL long_query_time = 1;  -- 超過 1 秒即記錄

2. 確認日誌狀態與路徑

mysql> SHOW VARIABLES LIKE 'slow%';
+---------------------+---------------+
| Variable_name       | Value         |
+---------------------+---------------+
| slow_launch_time    | 2             |
| slow_query_log      | ON            |
| slow_query_log_file | /tmp/slow.log |
+---------------------+---------------+

3. 啟用日誌記錄

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

慢日誌分析三板斧

  1. mysqldumpslow:官方工具,聚合相似 SQL,按次數/時間/掃描行排序
    mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
  2. pt-query-digest:Percona Toolkit 核心工具,功能最強
    pt-query-digest /var/log/mysql/slow.log --limit 20 --filter '\$event->{Query_time} > 2'
  3. 手工 EXPLAIN:對 TOP SQL 逐個 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
}
慢查詢日誌是資料庫健康體檢報告,持續收集、定期分析、持續優化,才是效能穩定的根本之道。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved