表上触发器导致慢查询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表上触发器导致慢查询相关的知识,希望对你有一定的参考价值。
触发器导致慢查询
情况说明:慢日志每天几乎同一时刻都会有一条删除的慢查询,而且语句一样,除了日期。然后发现表上只有一个主键,没有其它索引,看执行计划是全表扫描,但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条,时间还能接受,如果更改大部分行,那么时间相当可怕,因为变更了多少行,触发器就执行多少次,时间累加。
以上是关于表上触发器导致慢查询的主要内容,如果未能解决你的问题,请参考以下文章