[MYSQL案例][017] delete任务慢

2023-10-07 14:41:55 浏览数 (1)

由于空间问题, 需要定期清理某部分数据, 表未使用分区,还存在大字段, 且不能变更表结构.

故使用delete 定时删除某部分数据, sql如下, 循环跑的

代码语言:javascript复制
delete from table_name where col < some_date limit n;

col为时间类型,且存在索引, 执行计划也是走的索引. 加上limit 是考虑了主从延迟的问题, 但limit 的n 远远小于 where条件过滤后的数据量.

每次执行都要花费约20分钟时间.

优化后的sql为

代码语言:javascript复制
delete from table_name where col < some_date and col > some_date2 limit n;

也就是加了个时间下限,扫描的范围变小了. 之前扫描约1000W行, 加上下限后约200W行. 执行时间在1分钟以内.

但删除数据量太大, 导致binlog激增. 主从延迟又增大了.

故每次执行完, 都sleep 120; 将IO控制在100MB/s以内.

0 人点赞