mysql性能排查

clipboard.png

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
    • 長時間的sleep性能

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

      如何作:
      1 適當調低timeout
      2 主動kill超時不活躍鏈接
      3 按期檢查鎖、鎖等待
      4 能夠利用pt-kill工具優化

    • 其餘狀態spa

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