mysql性能排查思路

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)segmentfault

      緣由:
        DDL被阻塞 進而阻塞其餘後續sql
        DDL以前的sql長時間未結束
        
      如何作:
        1 提升每條sql的效率
        2 kill掉長時間運行的sql 3 把DDL放在夜間低谷時段 4 採用pt-osc執行DDL
    • 長時間的sleep工具

    1. 佔用鏈接數
    2. 消耗內存未釋放
    3. 可能有行鎖(甚至是表鎖未釋放)post

      如何作:
      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 分析慢日誌
相關文章
相關標籤/搜索