今天在生产上对表进行select查询,导致阻塞死锁,解决思路
执行
show PROCESSLIST;
或者以下sql
select * from information_schema.processlist;
上述指令是用来查看那些线程正在运行,你也可以得到这些信息,从INFORMATION_SCHEMA PROCESSLIST这个表,或者通过mysqladmin processlist指令。如果你有PROCESS权限,你可以查看所有的线程。否则,你只能查看你自己当前账户的线程。如果你没有使用FULL关键字,你只能查看每个记录中Info字段里面的前100个字符。(转载自别人说明)
我们线上的问题是执行select操作时,创建索引所以导致死锁,还有select太复杂查询时间过长导致阻塞
通过SHOW PROCESSLIST指令,发现有好多线程Command处于LOCK状态。最长的Time字段显示达到33772seconds,导致系统应用卡顿情况严重,
为了解决问题,在mysql立即调用KILL指令,杀掉进程
说明:connection选项,kill的时候,将连接也断掉,而query选项,kill的过程只是将该指令杀掉,连接还保持。 kill指令不指定connection或者query选项时,默认是connection。
这只是解决系统卡顿问题,源头还是sql本身问题,复杂度高,所查询的字段基本没走索引,最后是通过把sql拆分,并且把逻辑转移到程序层面,而不是在数据库操作,并且把查询频率高的字段添加索引,
参考(https://www.cnblogs.com/shihuc/p/8733460.html)