表上触发器导致慢查询

触发器导致慢查询
情况说明:慢日志每天几乎同一时刻都会有一条删除的慢查询,而且语句一样,除了日期。然后发现表上只有一个主键,没有其它索引,看执行计划是全表扫描,但count一下总共也就900多行,执行3秒钟,不能忍。给表上这个时间字段加上索引,删除是按照时间删的,看着扫描行数下来了,但是一执行还是3秒多,啥情况?

我把整张表dump出来,准备在自己删的差不多时候,再导回来。无意间打开导出的sql,发现该表上有一个删除行之后执行的触发器。

然后我就把触发器删除了,发现执行删除sql就很快,而且全表扫描也很快,但是触发器存在的情况下就极慢。

为啥呢???

我想看看我这条语句到底执行多久,于是我打开了profile功能。
通过set profiling=1
set session profiling_history_size = 100;

我这个sql一次删除31行
然后执行时间是2.28秒

show profiles
发现每个触发器平均执行0.07秒
0.07乘31等于2.17秒
这样的话,sql语句执行就是0.11秒

然后我又试了删除4行
发现总的执行时间是0.36秒,如果按触发器每条0.07秒,4条就是0.28秒,
那么sql的执行时间就是0.08秒。
基本上验证了一个猜测,执行的sql如果触发了触发器,那么执行的总时间就是sql执行时间+触发器执行时间。

如果更改的行数少,比如我这个4条,时间还能接受,如果更改大部分行,那么时间相当可怕,因为变更了多少行,触发器就执行多少次,时间累加。

猜你喜欢

转载自blog.51cto.com/8370646/2150164
今日推荐