首页 >> 基础教程
mysql中百万级别以上的数据如何删除
在MySQL中删除百万级别以上的数据时,直接执行DELETE FROM table
可能引发严重性能问题(如锁表、事务日志爆满、主从延迟等)。
分批删除
重点在于控制事务大小,删除数据量,避免业务高峰,注意是否使用索引。
-- 每次删除1万条(根据硬件调整) DELETE FROM your_table WHERE your_condition -- 必须带索引的条件! ORDER BY primary_key -- 按主键排序 LIMIT 10000;
循环执行直到影响行数为0。可通过脚本(如Python/Bash)或存储过程实现。
分区表直接删除分区
ALTER TABLE orders DROP PARTITION p2020_old; -- 删除整个分区(秒级完成)
前提:表已按时间/范围分区,且删除的数据集中在某分区。
重建表(保留需要的数据)
步骤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;
使用专业工具
pt-archiver(Percona Toolkit)
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