首页 >> 基础教程

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

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

  1. 分批删除

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

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

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

  2. 分区表直接删除分区

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

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

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

    1. 步骤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;
  4. 使用专业工具

    1. pt-archiver(Percona Toolkit)

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


对比性能:

方法速度锁影响适用场景
分批删除中等持续在线删除
分区删除极快极低数据按分区规则分布
重建表表锁瞬间可接受秒级业务中断
pt-archiver稳定极低生产环境首选




最新文章
mysql分页问题2025-08-04
千万数据先insert和先建索引哪个快2025-08-04
MySQL 中大小表关联查询如何优化2025-08-04
sql技巧-每个班年龄排前两名的人2025-08-03
MySQL 导致 cpu 飙升的话,要怎么处理呢?2025-07-29
MySQL 中为千万级大表添加字段2025-07-29
mysql中百万级别以上的数据如何删除2025-07-29
分库分表带来的问题2025-07-29
mysql中常用的分库分表中间件有哪些2025-07-29
mysql不停机扩容2025-07-29
备案号:蜀ICP备2023042032号-1