mysqlsla 是一款強大的 MySQL 慢查詢日誌分析工具,支援多種日誌格式,內建 SQL 語句去重與多維度排序功能,能快速定位效能瓶頸。本文記錄安裝、配置、常用參數與輸出結果解讀。
# 1. 安裝 Perl 依賴
yum -y install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
yum -y install perl-DBI perl-DBD-MySQL
yum -y install perl-CPAN
# 2. 透過 CPAN 安裝必要模組
perl -MCPAN -e shell
# 進入 CPAN 提示符後輸入:
cpan > install YAML
cpan > install Time::HiRes
# 遇到提示均輸入 yes
# 3. 下載並編譯安裝 mysqlsla
wget https://hackmysql.com/scripts/mysqlsla-2.03.tar.gz
tar xvfz mysqlsla-2.03.tar.gz
cd mysqlsla-2.03
perl Makefile.PL
make && make install
mysqlsla -lt slow -sort t_sum -top 1000 /tmp/slow_query.log
參數說明:
-lt slow:指定日誌類型為慢查詢日誌-sort t_sum:按總執行時間降序排序(預設)-top 1000:顯示前 1000 條分析結果Report for slow logs: slowquery.log
1.59k queries total, 69 unique
Sorted by 't_sum'
Grand Totals: Time 109 s, Lock 0 s, Rows sent 142.02k, Rows Examined 21.26M
______________________________________________________________________ 001 ___
Count : 26 (1.64%)
Time : 6.121513 s total, 235.443 ms avg, 202.917 ms to 311.527 ms max (5.63%)
95% of Time : 5.538256 s total, 230.761 ms avg, 202.917 ms to 271.056 ms max
Lock Time (s) : 2.407 ms total, 93 µs avg, 84 µs to 139 µs max (1.55%)
95% of Lock : 2.152 ms total, 90 µs avg, 84 µs to 99 µs max
Rows sent : 0 avg, 0 to 0 max (0.00%)
Rows examined : 153.68k avg, 153.67k to 153.69k max (18.79%)
Database :
Users :
root@localhost 127.0.0.1 : 100.00% (26) of query, 100.00% (1586) of all users
Query abstract:
SET timestamp=N; SELECT order_pid FROM wfc_delivery WHERE ( order_pid IN (S1) ) AND ( status IN (S3) ) GROUP BY order_pid;
Query sample:
SET timestamp=1387964641;
SELECT `order_pid` FROM `wfc_delivery` WHERE ( `order_pid` IN ('8831') ) AND ( `status` IN ('1','4','24') ) GROUP BY order_pid;
| 欄位 | 含義 |
|---|---|
| Count | SQL 執行次數及佔總慢查詢百分比 |
| Time | 總時間、平均時間、最小/最大時間、佔總慢查詢時間百分比 |
| 95% of Time | 去除最快/最慢 5% 後,覆蓋 95% 執行時間的統計 |
| Lock Time | 等待鎖的總/平均/最小/最大時間 |
| Rows sent | 返回結果行數統計 |
| Rows examined | 掃描行數統計(關鍵效能指標) |
| Query abstract | 抽象化後的 SQL 模板(參數化) |
| Query sample | 實際執行的 SQL 範例 |
| 參數 | 說明 | 範例 |
|---|---|---|
-log-type (-lt) | 指定日誌類型:slow, general, binary, msl, udl | -lt slow |
-sort | 排序依據:t_sum(總時間), c_sum(總次數), c_sum_p(次數佔比) | -sort c_sum |
-top | 顯示前 N 條結果,預設 10 | -top 50 |
-statement-filter (-sf) | 過濾 SQL 類型:+SELECT,+INSERT 或 -UPDATE 等 | -sf "+SELECT,INSERT" |
-db | 只分析指定資料庫的日誌 | -db funsion |
# 只取 funsion 資料庫的 SELECT 語句,按總時間排序,取前 1000 條,輸出到文件
mysqlsla -lt slow -sort t_sum -sf "+SELECT" -db funsion -top 1000 /tmp/slow_query.log > ./slow_query.pretty.log
[mysqld]
log_slow_queries = ON
log-slow-queries = /tmp/slow_query.log
long_query_time = 1
修改後需重啟 MySQL 服務生效。long_query_time=1 表示記錄執行超過 1 秒的查詢。
mysqlsla 透過多維度統計與排序,能幫助 DBA 快速鎖定最耗資源的 SQL 語句。結合 Rows examined、Lock Time 等指標,配合 EXPLAIN 分析執行計劃,可高效優化慢查詢。