总结:
1.alter锁表,海里数据表中新增字段
2.使用EXPLAIN/SHOW PROCESSLIST定位sql锁表
3.etl使用临时表导入数据,在目的表未加索引的情况下会导致锁表(SHOW PROCESSLIST定位出结论)
4.亲身经历:spring aop事物,在切面粒度过大时会触发连接池不够:如@Transaction method中含有http请求的操作(http服务超时严重)
5.sql中使用隐示类型转换导致查询缓慢
SHOW PROCESSLIST 来源:https://www.jb51.net/article/70955.htm https://www.jb51.net/article/93919.htm
我们知道分析MySQL语句查询性能的方法除了使用EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”。
一、 起因
研发反应某台数据库僵死,后面的会话要么连接不上,要么要花费大量的时间返回结果,哪怕是一个简单的查询。
二、 处理
首先去监控平台查看服务器以及数据库状态,发现这台数据库有大量的慢查询。继续看服务器监控,CPU 平均使用率较高,IO 读写平均值正常。登录到 MySQL,使用 SHOW PROCESSLIST 查看会话状态,总数居然有 600+,这是很不正常的。查看慢查询日志,发现出问题的 SQL 主要集中在几个,有 SUM、有 COUNT、有等值操作等等。这台 MySQL 服务器的 long_query_time 设置为 3秒,而一个简单的查询却要几十秒,这显然是有问题的。写脚本试着 kill 掉相关的会话,发现于事无补,仍然有大量的连接进来。此时使用 top 查看服务器状态,mysqld 进程占用内存和 CPU 居高不下。
故障期间的慢查询数,如图:
CPU 平均使用率,如图: