由于空间问题, 需要定期清理某部分数据, 表未使用分区,还存在大字段, 且不能变更表结构.
故使用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以内.