一道很有意思的MySQL面试题
声明:接上一篇文章【】
曾经有这样一道面试:如果要你删除一张表里的前10000行数据,有以下三种方案:第一种,直接执行 delete from table_name order by id limit 10000;第二种,在一个连接中循环执行20次delete操作 delete from table_name order by id limit 500;第三种,在20个连接中同时执行 delete from table_name order by id limit 500。请问哪种方案最优?
下面就让我们来分析一下。
第一种方案
一次性删除10000行数,大家已经知道delete操作是不会释放磁盘资源的。由于三种方案都没有加条件,所以delete执行过程中会扫描到主键索引上,就会锁表。但是所幸带了limit,在命中10000行后,就立马会return,但是直接执行删除10000行,这本身就是一个事务,而且时间会比较长,从而会造成其他业务不能办理。所以,这不是最优方案。
第二种方案
相比第一种方案,第二种是在第一种方案进行了升级,在一次事务中,同时执行20次delete,将时间缩短至少为原来的二十分之一,并且保证了不会冲突。
第三种方案
第三种方案其实也是想通过增加执行次数缩短资源占用时间,但是由于它不在同一个事务里,势必会存在不一致性,从而导致锁冲突,实际上行不通。
通过简单的分析,我想大家已经对delete limit的用法,有了更深层次的理解。下一篇,我们讲truncate为什么比delete快。