二、慢查询发生的语句

代码块
DELETE FROM whole_rerun_task_slopsWHERE 1 = 1

三、explain执行计划:

image.png

【根因】

delete 大量数据触发全表扫描

四、解决方案(采用方案二)

方案一:先分页查询出最大id,再删除小于最大id的数据

代码块
第一次
select id from whole_rerun_task_slops where id >= 1 order by id limit 10000,1//输出59999
delete from whole_rerun_task_slops where id < 59999

第二次
select id from whole_rerun_task_slops where id >= 59999 order by id limit 10000,1//输出6999
delete from whole_rerun_task_slops where id < 6999

思考:
加入where id >= 59999是因为,此逻辑是先查询后删除。
查询走的是从库,删除删的是主库。如果不加上where id >= 59999,会产生,主库虽然删除,但是从库数据还存在的情况。 所以第二次查询要在第一次结果的基础上再查询。

方案二:delete+orderby+limit 一句搞定

代码块
delete from whole_rerun_task_slops where 1=1 order by id asc limit 10000

执行计划如下

image.png
结果:发现删除时候走索引,删除1W条数据预计花费0.4s 符合预期。