MySQL innoDB更新缓慢(不清楚)
我有一个相当简单的查询,在大多数情况下运行得非常快,在其他罕见的情况下需要30秒。我不知道是什么引起的。这是我所说的一个例子 mysql>更新matchSessionMembers msm加入matchSessions ms ON msm.matchNo=ms.matchNo和ms.STATUS!='N'设置msm.STATUS='P' 其中msm.memberNo=7,msm.STATUS=MMySQL innoDB更新缓慢(不清楚),mysql,sql,innodb,Mysql,Sql,Innodb,我有一个相当简单的查询,在大多数情况下运行得非常快,在其他罕见的情况下需要30秒。我不知道是什么引起的。这是我所说的一个例子 mysql>更新matchSessionMembers msm加入matchSessions ms ON msm.matchNo=ms.matchNo和ms.STATUS!='N'设置msm.STATUS='P' 其中msm.memberNo=7,msm.STATUS=M 查询正常,0行受影响(0.00秒) 匹配的行:0已更改:0警告:0 mysql>更新matchSes
查询正常,0行受影响(0.00秒)
匹配的行:0已更改:0警告:0 mysql>更新matchSessionMembers msm加入matchSessions ms ON msm.matchNo=ms.matchNo和ms.STATUS!='N'设置msm.STATUS='P' 其中msm.memberNo=7,msm.STATUS=M
查询正常,0行受影响(0.00秒)
匹配的行:0已更改:0警告:0 mysql>更新matchSessionMembers msm加入msm.matchNo=ms.matchNo和ms.STATUS上的matchSessions ms!='N'设置msm.STATUS='P' 其中msm.memberNo=7,msm.STATUS=M
查询正常,0行受影响(3.01秒)
匹配行:0已更改:0警告:0 mysql>更新matchSessionMembers msm加入matchSessions ms ON msm.matchNo=ms.matchNo和ms.STATUS!='N'设置msm.STATUS='P' 其中msm.memberNo=7,msm.STATUS=M
查询正常,0行受影响(0.00秒)
匹配的行:0已更改:0警告:0 mysql>更新matchSessionMembers msm加入msm.matchNo=ms.matchNo和ms.STATUS上的matchSessions ms!='N'设置msm.STATUS='P' 其中msm.memberNo=7,msm.STATUS=M
查询正常,0行受影响(1.88秒)
匹配行:0已更改:0警告:0 mysql>更新matchSessionMembers msm加入matchSessions ms ON msm.matchNo=ms.matchNo和ms.STATUS!='N'设置msm.STATUS='P' 其中msm.memberNo=7,msm.STATUS=M
查询正常,0行受影响(0.00秒)
匹配的行:0已更改:0警告:0 在这个查询中,我为所有msm.matchNo、ms.matchNo、ms.status、msm.status和msm.memberNo设置了索引 我对同一个查询运行了6次,有4次查询在不到一秒钟的时间内完成,而有2次查询的处理时间超过一秒钟。我做了更多的测试,得到了其中一个更严重案例的概要数据,执行这个愚蠢的查询需要30秒
mysql> SHOW PROFILE FOR QUERY 3;
+---------------------------+-----------+
| Status | Duration |
+---------------------------+-----------+
| starting | 0.000075 |
| checking permissions | 0.000013 |
| checking permissions | 0.000012 |
| Opening tables | 0.000073 |
| checking permissions | 0.000011 |
| checking permissions | 0.000013 |
| System lock | 0.000023 |
| init | 0.000021 |
| updating main table | 0.000014 |
| optimizing | 0.000020 |
| statistics | 0.000117 |
| preparing | 0.000028 |
| executing | 0.000011 |
| Sending data | 31.940094 | <==
| updating reference tables | 0.000039 |
| end | 0.000016 |
| end | 0.000015 |
| query end | 0.000048 |
| closing tables | 0.000039 |
| freeing items | 0.000036 |
| logging slow query | 0.000011 |
| cleaning up | 0.000014 |
+---------------------------+-----------+
mysql>显示查询3的配置文件;
+---------------------------+-----------+
|状态|持续时间|
+---------------------------+-----------+
|启动| 0.000075 |
|检查权限| 0.000013 |
|检查权限| 0.000012 |
|期初表| 0.000073 |
|检查权限| 0.000011 |
|检查权限| 0.000013 |
|系统锁| 0.000023 |
|初始值| 0.000021 |
|更新主表| 0.000014 |
|优化| 0.000020 |
|统计数字| 0.000117 |
|编制| 0.000028 |
|执行| 0.000011 |
|发送数据| 31.940094 |我找到了答案
我犯了一个愚蠢的错误。不过,要识别它并不容易。
我有一个不同的超慢查询,大约每小时运行一次,一个更新查询的执行时间超过30秒。我不能完全确定,但我认为那个查询一定锁定了所有内容,并将所有其他查询放入队列中
我在慢速查询日志中没有注意到它,因为它被隐藏在由这一次愚蠢查询产生的所有其他慢速查询下
我希望这能帮助其他有类似问题的人。我们讨论了多少行?我的意思是这两个表中的大约行数。请尝试更新matchSessionMembers msm JOIN matchSessions ms ON msm.matchNo=ms.matchNo设置msm.STATUS='P',其中msm.memberNo=7和msm.STATUS='M'和ms.STATUS!='N′代码>并报告。数量不算太多。大约110k用于matchSessions,220k用于matchSessionMembers。发送数据瓶颈实际上是在这之前所花的时间。这是一个已知的查询分析问题。因此,执行是造成瓶颈的原因,这很可能是由于必须检查的行数。@N.B.我已经想到了这一点,但我不明白为什么查询时间如此不一致。