mysql性能瓶頸排查 top/free/vmstat/sar/mpstat
- 查看mysqld進程的cpu消耗佔比
- 確認mysql進程的cpu消耗是%user, 仍是sys%高
- 確認是不是物理內存不夠用了
- 確認是否有swap產生
top (%cpu load %MMEM) free -gt vmstat -S m 1 (procs io cpu) sar -u 1 (%user) sar -d 1
如何優化
- 硬件優化
-
查看mysql線程狀態 show [full] processlistmysql
-
長時間的Sending datasql
從引擎層讀取數據返回給server端 長時間存在的緣由: 1 沒有合適的索引 查詢效率低下 2 讀取大量數據 讀取緩慢 3 系統負載高 讀取緩慢 如何作: 1 加上合適的索引 2 改寫sql 3 增長LIMIT限制每次讀取量 4 檢查&升級IO設備性能
-
長時間等待MDL鎖 (waiting for table metadata lock)工具
緣由: DDL被阻塞 進而阻塞其餘後續sql DDL以前的sql長時間未結束 如何作: 1 提升每條sql的效率 2 kill掉長時間運行的sql 3 把DDL放在夜間低谷時段 4 採用pt-osc執行DDL
-
長時間的sleeppost
- 佔用鏈接數
- 消耗內存未釋放
-
可能有行鎖(甚至是表鎖未釋放)性能
如何作:
1 適當調低timeout
2 主動kill超時不活躍鏈接
3 按期檢查鎖、鎖等待
4 能夠利用pt-kill工具測試
-
其餘狀態優化
Copy to tmp table [on disk] 執行alter table修改表結構,須要生成臨時表 建議放在夜間低谷進行, 或者用pt-osc Creating tmp table 常見於group by沒有索引的狀況 須要拷貝數據到臨時表[內存/磁盤上] 執行計劃中會出現Using temporary關鍵字 建議建立合適的索引,消除臨時表 Creating sort index 常見於order by沒有索引的狀況 須要進行filesort排序 執行計劃中會出現Using filesort關鍵字 建議建立排序索引
-
其餘排除方法
- use information_schema; SELECT * from innodb_lock_waits;
- show engine innodb status;
- 測試環境調低long_query_time的值 開啓log_queries_not_using_indexes 分析慢日誌