mysql查询因为索引导致表阻塞或死锁

今天在生产上对表进行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

 

 

 

你可能感兴趣的:(开发日记)