mysql长事务慢查询解决方案_MySQL : 如何监控和处理慢查询与长事务 ?
什么是慢查詢、長事務 ?
慢查詢 是指一條 SQL 的執行時間太長。比如在一個有100w條數據的表中,查詢一條數據時未命中索引,從而通過全表掃描查詢數據,這個查詢會耗時很長。這就是一個 Long SQL 。類似,更新數據、刪除數據也可能出現慢查詢 。
長事務,是指事務開啟后長時間未結束(commit或者rollback都沒執行)。出現長事務的原因有很多,例如:
事務中有一個慢查詢;
就是忘記結束事務了;
一個長事務中鎖住了一些資源,導致其他需要該資源的事務也變成長事務。
很多情況下,慢查詢和長事務,會對業務產生很大的負面影響:
業務響應太慢。
連接數暴漲。
如何發現慢查詢 ?
方法1:
使用 show processlist?查看MySQL 線程情況,若有 Command 為 Query?,Time 很大的線程在列表中,那么這個線程就是在執行一個慢查詢。Info 字段能看出來對應的 SQL 。
select * from information_schema.processlist?效果和 show processlist?相同。
示例:
方法2:
開啟慢查詢日志,實時解析日志內容。
略。
如何處理不可接受的慢查詢?
如果慢查詢在意料之中,可接受,那么不用處理。否則應該:
干掉此次的慢查詢。使用 kill ?,id 是 show processlist?返回的 Id 。
優化SQL、索引等,防止再次出現慢查詢。
如何發現長事務?
查詢結果中,idle_time 過大的事務就是長事務。輸出結果中, trx_mysql_thread_id? 是對應的線程標識。
如何干掉長事務?
方案1
從 INFORMATION_SCHEMA.INNODB_TRX?得到的長事務信息中,有對應的線程標識, kill 掉即可。
方案2
設置較小的 wait_timeout?可以干掉部分長事務。
對于業務代碼,使用的是非交互模式的連接,可以使用 wait_timeout?設置超時時間。相當于,若某個連接在 wait_timeout?這個時間范圍內是空閑的,MySQL 服務器會自動關閉連接。
注意,數據庫連接池參數要根據情況調整下。
總結
以上是生活随笔為你收集整理的mysql长事务慢查询解决方案_MySQL : 如何监控和处理慢查询与长事务 ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ntext在mysql_varchar和
- 下一篇: python项目打包部署到ios_Pyt