Mysql删除几亿条数据表中的部分数据的方法实现

 更新时间:2025年03月30日 10:24:28   作者:树欲静而风不止  
在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定的参考价值,感兴趣的可以了解一下

1、需求

老项目,实时数据还是用mysql去存储的,而且又没有定时去清理数据的程序。目前这些实时数据只需保留近半年的即可。

其他几张实时表数据量没有这么夸张。

我随即用

delete from table_name where id < 39000000 limit 10000

但是几亿条记录用这个方法太慢了。

2、方案

虽然之前也处理过类似问题,但还是随手问了一下AI,有无更优解。

在MySQL中删除一个大表(例如含有几亿条记录)中的数据时,需要特别注意操作的性能和对系统的影响。如果您的目标是删除半年前的数据,您可以采用以下几种策略来高效地完成这项任务:

1. 使用 DELETE 语句分批删除

一种常见的方法是使用 DELETE 语句,并通过分批删除数据来减轻数据库的压力。这可以通过在 DELETE 语句中添加 LIMIT 子句来实现。

示例 SQL 语句

-- 定义每批删除的数量
SET @batch_size = 100000; -- 每次删除 10 万条记录
SET @counter = 0;

-- 确定半年前的日期
SET @six_months_ago = DATE_SUB(CURDATE(), INTERVAL 6 MONTH);

-- 分批删除数据
REPEAT
    DELETE FROM your_table
    WHERE time < @six_months_ago
    LIMIT @batch_size;
    SET @counter = @counter + 1;
UNTIL @counter = 0 END REPEAT;

2. 使用 INPLACE ALTER TABLE

对于InnoDB表,可以使用 ALTER TABLE 来删除数据,这通常比 DELETE 更快。然而,此方法要求您能够确定删除的行不会被引用(例如通过外键)。此外,这种方法可能不是所有版本的MySQL都支持。

示例 SQL 语句

-- 确定半年前的日期
SET @six_months_ago = DATE_SUB(CURDATE(), INTERVAL 6 MONTH);

-- 创建一个临时表,只包含需要保留的数据
CREATE TABLE temp_table AS SELECT * FROM your_table WHERE time >= @six_months_ago;

-- 删除原始表
DROP TABLE your_table;

-- 重命名临时表为原始表的名字
RENAME TABLE temp_table TO your_table;

3. 使用 TRUNCATE TABLE 和重新插入数据

如果您可以接受删除所有数据并重新插入数据,那么可以使用 TRUNCATE TABLE 来清空整个表,然后只插入最近六个月的数据。这种方法适用于那些可以承受完全清空表的场景。

-- 确定半年前的日期
SET @six_months_ago = DATE_SUB(CURDATE(), INTERVAL 6 MONTH);

-- 清空表
TRUNCATE TABLE your_table;

-- 重新插入最近六个月的数据
INSERT INTO your_table
SELECT * FROM your_table
WHERE time >= @six_months_ago;

注意事项

  • 备份数据:在执行任何大规模删除操作之前,一定要做好数据备份以防万一。
  • 监控性能:在执行删除操作时,应密切监控MySQL服务器的性能指标,如CPU使用率、磁盘I/O等。
  • 禁用外键检查:如果表上有外键约束,可以暂时禁用外键检查。
  • 禁用自动提交:在开始删除操作之前,可以关闭自动提交,然后在删除完成后手动提交事务。

示例 SQL 脚本

以下是一个完整的SQL脚本示例,使用分批删除的方式删除半年前的数据:

-- 设置变量
SET @batch_size = 100000; -- 每次删除 10 万条记录
SET @counter = 0;

-- 确定半年前的日期
SET @six_months_ago = DATE_SUB(CURDATE(), INTERVAL 6 MONTH);

-- 分批删除数据
REPEAT
    DELETE FROM your_table
    WHERE time < @six_months_ago
    LIMIT @batch_size;
    SET @counter = @counter + 1;
UNTIL @counter = 0 END REPEAT;

总结

选择哪种方法取决于您的具体需求和资源。如果数据量非常大,建议先在一个较小的数据集上测试所选方法的性能,然后再应用到整个表。此外,在执行此类操作时,最好在业务低峰期进行,以减少对应用程序的影响。

看来也没有更好的办法,还是这些老办法。

3、实战

先新建一张copy的表。

注意:新建表的自增索引ID,还是会从1开始的。

CREATE TABLE new_table_name LIKE existing_table_name;

接下来二个方案

1、实时数据不能停的,先改名,把名称互换。等数据插入一波,再启动迁移。主要是为了插入一波后自增索引自动调整。避免冲突

RENAME TABLE temp TO users;

2、实时数据能停的,那么就先停掉。再名称互换,再改动自增索引起点值。这时候其实可以开启插入程序了。

3.1转移

一张表近半年的数据是从390000000差不多开始。那么就好处理了

几千万条数据也是比较快的。

另一张表更大,有近1-2个亿的数据,那么我是2kw-3kw 批量一次,也就半小时。即可完成。

到此这篇关于Mysql删除几亿条数据表中的部分数据的方法实现的文章就介绍到这了,更多相关Mysql删除亿条数据表部分数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql触发器同步表的数据方式

    mysql触发器同步表的数据方式

    这篇文章主要介绍了mysql触发器同步表的数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • mysql database manual(mysql数据库手册)

    mysql database manual(mysql数据库手册)

    mysql database manual(mysql数据库手册),使用mysql的朋友可以参考下。
    2011-09-09
  • MySQL慢查询日志的配置与使用教程

    MySQL慢查询日志的配置与使用教程

    慢查询日志用于记录一些过慢的查询语句,可以帮助管理员分析问题所在,下面这篇文章主要给大家介绍了关于MySQL慢查询日志的配置与使用教程,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-09-09
  • linux下mysql数据库单向同步配置方法分享

    linux下mysql数据库单向同步配置方法分享

    mysql数据库单向同步又叫做主从复制,是通过二进制日志文件完成的,注意:mysql 数据库的版本,两个数据库版本要相同
    2012-06-06
  • MySQL基本表查询操作汇总之单表查询+多表操作大全

    MySQL基本表查询操作汇总之单表查询+多表操作大全

    本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • MySQL一键安装Shell脚本的实现

    MySQL一键安装Shell脚本的实现

    本文主要介绍了MySQL一键安装Shell脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • MySQL分页查询优化的实践指南

    MySQL分页查询优化的实践指南

    在日常业务开发中,分页查询是高频操作,比如列表页数据展示、历史记录查询等,但当数据量达到万级以上时,普通的limit分页往往会出现性能瓶颈,本文基于实际测试场景,详细分析MySQL分页查询优化的实践指南,需要的朋友可以参考下
    2025-12-12
  • mysql配置环境变量实践(win10)

    mysql配置环境变量实践(win10)

    文章介绍了如何在Windows 10系统中配置MySQL环境变量,包括设置MYSQL_HOME和Path变量,并展示了如何在cmd中验证配置
    2026-01-01
  • mysql服务性能优化—my.cnf_my.ini配置说明详解(16G内存)

    mysql服务性能优化—my.cnf_my.ini配置说明详解(16G内存)

    这篇文章主要介绍了mysql服务性能优化—my.cnf_my.ini配置说明详解(16G内存),需要的朋友可以参考下
    2016-05-05
  • MySQL 序列(AUTO_INCREMENT)的使用示例

    MySQL 序列(AUTO_INCREMENT)的使用示例

    本文主要介绍了MySQL 序列(AUTO_INCREMENT)的使用示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11

最新评论