请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

delete 删除时不走索引

老师,我工作中有一个批量删除的语句,执行特别慢,删除1000条数据大概耗时20多秒,给删除语句执行测试计划,如下:

explain delete  
from coverage_data 
where coverage_data.record_id in (12698284585,731284586,8731284587);

图片描述
通过上面执行计划来看,并没有走索引。
这个coverage_data表的结构如下,record_id是一个索引字段
图片描述

请问老师这种 delete 批量删除有什么优化方案?


补充
将删除SQL分解成查询,执行测试计划,如下

explain select id  
from coverage_data 
where coverage_data.record_id in (12698284585,731284586,8731284587);

图片描述
根据extra 列信息,是走了索引的

正在回答

1回答

图上看着是走索引了。但是删除跟查询不一样,必须去主表删掉记录,所以有using where。

可以看一下这个表索引和外键是不是特别多,因为删数据时候会维护索引和外键,有额外的开销。

或者把要删除的数据select一下,看看是查询慢,还是后面删除慢。


1 回复 有任何疑惑可以回复我~
  • 提问者 Robot2 #1
    老师,这个表只有两个索引,主键id和record_id,但是表的字段比较多,大概15个字段,其中有几个longtext类型的字段(存储json,应该会影响查询效率),我单独执行select 语句,并没有特别慢,基本都是毫秒级别
    回复 有任何疑惑可以回复我~ 2022-06-15 15:25:28
  • 提问者 Robot2 #2
    非常感谢!
    回复 有任何疑惑可以回复我~ 2022-06-15 15:28:28
  • Moody 回复 提问者 Robot2 #3
    innodb删除效率确实不高,再加上那几个json字段肯定是溢出了,再去blob页删他们,效率更低了。一般考虑在表中加入一个删除标志字段,先标记删除,等到空闲时再清理。清理时可以用队列慢慢做。
    回复 有任何疑惑可以回复我~ 2022-06-15 15:31:41
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信