MySQL:SQL执行时间很长没结果(没有锁表的情况下) 您所在的位置:网站首页 我的世界圈养的羊过段时间都没了 MySQL:SQL执行时间很长没结果(没有锁表的情况下)

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

2024-07-05 20:35| 来源: 网络整理| 查看: 265

一般来说一条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问题可以解决很大一部分。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有