一道很有意思的MySQL面试题

声明:接上一篇文章【你习惯delete语句后带上limit吗】

曾经有这样一道面试:如果要你删除一张表里的前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快。

(0)

相关推荐