MySQL 快速删除大量数据(千万级别)的几种实践方案——附源码
笔者最近工作中遇见一个性能瓶颈问题,MySQL表,每天大概新增776万条记录,存储周期为7天,超过7天的数据需要在新增记录前老化。连续运行9天以后,删除一天的数据大概需要3个半小时(环境:128G, 32核,4T硬盘),而这是不能接受的。当然如果要整个表删除,毋庸置疑用 TRUNCATE TABLE 就好。 最初的方案(因为未预料到删除会如此慢),代码如下(最简单和朴素的方法): delete from table_name where cnt_date <= target_date 后经过研究,最终实现了飞一般(1秒左右)的速度删除770多万条数据,单张表总数据量在4600万上下,优化过程的方案层层递进,详细记录如下: 批量删除(每次限定一定数量),然后循环删除直到全部数据删除完毕;同时 key_buffer_size 由默认的8M提高到512M 运行效果: 删除时间大概从3个半小时提高到了3小时 (1)通过 limit (具体size 请酌情设置) 限制一次删除的数据量,然后判断数据是否删除完,附源码如下(Python实现): def delete_expired_data(mysqlconn, day): mysqlcur = mysqlconn.cursor() delete_sql = " DELETE from table_name where cnt_date<='