MySQLTuner.pl 是 Perl 編寫的輕量級 MySQL 性能診斷腳本,通過分析 SHOW GLOBAL STATUS/VARIABLES 輸出快速生成健康報告。它不是「銀彈」,但極適合**初次接手陌生實例、定期巡檢、驗證調優效果**的場景。本文詳解安裝、運行、核心報告解讀、典型建議背後的原理及**盲目執行的風險**。
# 下載
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
chmod +x mysqltuner.pl
# 運行 (需提供有權限的賬號,建議只讀監控賬號)
perl mysqltuner.pl --user=monitor --pass='xxx' --socket=/var/lib/mysql/mysql.sock
# 常用參數
--host=127.0.0.1 --port=3306
--nocolor # 關閉顏色輸出,適合日誌存檔
--nobanner # 簡潔模式
--buffers # 顯示全局/線程緩存計算詳情
--help # 查看所有選項
Reads / Writes: 84% / 16% 判斷讀寫比例,指導緩存/索引策略。OPTIMIZE TABLE (或 ALTER TABLE ... ENGINE=InnoDB 在線重建) 整理,回收空間、提升掃描效率。| 指標 | 示例值 | 判讀邏輯與行動 |
|---|---|---|
| Maximum possible memory usage | 37.4G (479% RAM) | 🔴 危險! 理論峰值內存超過物理內存。公式:Global Buffers + (Thread Buffers × max_connections)。 行動:降低 per-thread 緩存 (sort/join/read_buffer) 或降低 max_connections,或加內存。**絕不可忽視**。 |
| Slow queries | 0% (194/338M) | 比例低但絕對值 194 條需分析。行動:開啟慢查詢日誌 (long_query_time=1) 並用 pt-query-digest 分析。 |
| Highest connection usage | 25% (760/3000) | 連接池配置過大 (max_connections=3000 過高)。行動:調整應用連接池上限、降低 max_connections 至峰值 1.5 倍 (如 1200)。 |
| Key buffer hit rate | 100.0% | MyISAM 索引緩存充足 (若無 MyISAM 表可忽略)。 |
| Query cache efficiency | 45.0% | 命中率一般。關鍵看 Prunes。 |
| Query cache prunes per day | 585,977 | 🔴 嚴重!緩存不夠用頻繁淘汰。行動:增大 query_cache_size 或 (推薦) 關閉 QC (query_cache_type=0),應用層用 Redis。 |
| Joins performed without indexes | 28,072 | 🔴 嚴重!大量無索引 Join (全表掃描)。行動:開啟 log_queries_not_using_indexes 定位 SQL,加索引或改寫。 |
| Table cache hit rate | 1% (512 open / 44K opened) | 🔴 極低!table_open_cache=512 遠小於並發熱表數。行動:調大至 5000+ 並同步 open_files_limit (見 91374)。 |
| Thread cache hit rate | 99% | thread_cache_size 設置合理。 |
| Open file limit used | 5% (772/15K) | 文件描述符充足。 |