MySQL:SQL执行时间很长没结果(没有锁表的情况下)

一般来说一条SQL执行时间很长没有结果,可以看表有没有被锁。
执行
show OPEN TABLES where In_use > 0;
来看有没有表被锁住,有结果就是被锁表了。
但有的时候并不一定是锁表导致SQL长时间执行没结果,或者人家直接就报错返回告诉你没有别表被锁。这时候你可能要从事务的方面去想。是不是有一个事务正在执行或者别的状态导致的,我就遇到类似的一个问题。

问题:
执行长时间没有结果,但是没有锁表,将PROCESSLIST里面中几个耗时最长的kill掉也没用。

原因:
为什么会有这样一个事务一直是执行中的状态呢。其实这个是因为在执行的过程中,你操作debug的时候,进程没有跑完还是在执行中的状态,但是呢你没有继续,结果时间一长超时导致失去连接与数据库。但是数据库对应的事务还在跑。

举个例子我们操作一个表同一字段多个数据更新,结果更新完第一个你就停了没继续,但是都对应的一个事务,时间过长失去连接但事务一直有效切实进行中的状态。如果你单条数据执行的话,可能你都来不及去刷新INNODB_TRX 事务表去查看对应的事务,因为很快这个事务就跑完了,就没了从事务表上,来看事务但是多条数据的事物是会存在这样情况的。

解决:
就是发现有一个事务是正在执行的转态,要kill掉他的进程ID。如下图(要注意的是我们要kill掉的进程是线程ID thread_id而不是事务ID trx_id,因为要kill掉进程而不是什么事务之类的。)
在这里插入图片描述

总结和收获:
首先这个特殊情况体验到了,蛮有意思的,尤其是了解到INNODB中的schema中这些东西,把这些表了解了知道是干嘛的都是一个很大的进步。

其实现在大家用的引擎都是INNODB,在可视化工具中其实我们其实不需要通过命令什么的的也可以看到表的状态,被锁的表,现在的进程,以及事务表中的事务等,都可以在information_schema看并借此来判断问题。

比如说我们的进程表PROCESSLIST对应在information_schema中是PROCESSLIST表,参看下图:
在这里插入图片描述

对应的还有我们刚才判断问题的事务表INNODB_TRX 还有锁表情况对应的表是INNODB_LOCKS。可以说这里边的东西弄清楚,MySQL问题可以解决很大一部分。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值