今天遇到一个有意思的案例,一开发同事告诉我他删除一个表的记录非常慢,已经快1个多小时了还没有完成。而且删除的记录只有1百多条。真是大跌眼镜的一件
事情。最后发现该表与多个表有外键关联关系(这个表即是主表、又是从表),最后我禁用引用该表的外键约束后。一秒内删除了记录。然后启用外键约束关系。下
面记录、分析一下解决过程的思路(下面是在测试环境的记录,数据量不一样)。
我
去处理这个问题时,首先怀疑可能是sql的阻塞、触发器、外键约束、高水位线等因素中的某一个导致delete操作慢,于是我打算一个一个排除,我先试着
删除一条记录,然后去检查sql的阻塞情况,结果使用下面sql语句并没有发现sql被阻塞。于是sql的阻塞导致delete慢的原因被我排除了。
接下来,我检查了该表的的触发器,结果并没有发现delete触发器。也就是说delete操作并不会触发任何触发器。触发器导致delete慢的怀疑也可以排除掉了。
我用show_space检查了一下这个表的高水位线,发现并没有问题,不需要收缩高水位线。高水位线这个因素也可以排除了。只剩下外键约束的影响了。于是检查了一下有哪些表是该表的从表,如下所示

有时候也可以用下面语句查看引用这个表的外键引用关系
如上所示,inv_location_pallets这个表有三个从表,而这里面有个表的记录很大,大概2千多万。所以导致delete操作很慢。