首页 >> 基础教程

mysql中百万级别以上的数据如何删除

在MySQL中删除百万级别以上的数据时,直接执行DELETE FROM table可能引发严重性能问题(如锁表、事务日志爆满、主从延迟等)。

  1. 分批删除

  2. 重点在于控制事务大小,删除数据量,避免业务高峰,注意是否使用索引。

  3. -- 每次删除1万条(根据硬件调整)
    DELETE FROM your_table 
    WHERE your_condition 
    -- 必须带索引的条件!
    ORDER BY primary_key 
    -- 按主键排序
    LIMIT 10000;
    

    循环执行直到影响行数为0。可通过脚本(如Python/Bash)或存储过程实现。

  4. 分区表直接删除分区

  5. ALTER TABLE orders DROP PARTITION p2020_old; -- 删除整个分区(秒级完成)

    前提:表已按时间/范围分区,且删除的数据集中在某分区。

  6. 重建表(保留需要的数据)

  7. 步骤1: 创建新表存储需保留的数据 CREATE TABLE new_table LIKE old_table; INSERT INTO new_table  SELECT * FROM old_table  WHERE create_time > '2023-01-01'; -- 保留条件-- 步骤2: 原子切换表(业务停机时间极短) RENAME TABLE old_table TO old_backup, new_table TO old_table; 步骤3: 删除旧表 DROP TABLE old_backup;

  8. 使用专业工具

  9. pt-archiver(Percona Toolkit)

  10. pt-archiver \ --source h=localhost,D=db,t=table \ --where "create_time < '2020-01-01'" \ --purge --limit 10000 --commit-each

对比性能:

方法

速度

锁影响

适用场景

分批删除

中等

持续在线删除

分区删除

极快

极低

数据按分区规则分布

重建表

表锁瞬间

可接受秒级业务中断

pt-archiver

稳定

极低

生产环境首选

所有评论

最新文章
20.5 性能优化建议2026-05-08
20.4 复杂查询实现2026-05-08
20.3 表创建与数据初始化2026-05-08
20.2 数据库设计2026-05-08
20.1 项目需求分析:博客系统2026-05-08
19.4 自动化备份策略2026-05-08
19.3 导出和导入数据2026-05-08
19.2 恢复备份数据2026-05-05
19.1 使用mysqldump备份数据2026-05-05
18.4 实战:开发简单的学生管理系统2026-05-05
关于我 备案号:蜀ICP备2023042032号-1