前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL实战:五百万条数据如何不影响生产环境使用的情况下平稳删除

MySQL实战:五百万条数据如何不影响生产环境使用的情况下平稳删除

原创
作者头像
IT技术分享社区
修改2024-07-04 09:40:26
2440
修改2024-07-04 09:40:26
举报
文章被收录于专栏:MYSQL

大家在日常运维数据库过程当中经常会遇到数据删除的情况,如果生产环境数百万条数据中,删除其中一部分数据,应该如何不影响生产环境使用的情况下进行数据删除呢,这里给大家分享一个比较简单且实用的删除方式,避免一次性删除造成数据库直接卡死,从而影响正常生产使用。

一、案例介绍

首先给大家分享一个这样一个真实的业务场景,基于myhsql数据库搭建的仓储系统有一张出入库库存的数据表,目前系统已经运行了五六年了,数据量达到了五百多万。客户反馈现场进行出入库的时候非常慢,有的时候需要一分钟甚至更久。客户提出需要优化一下现场人员出入库的速度。这边首先想到的一个比较直接有效的方案就行根据年份删除历史数据,并进行历史数据的备份,以便后续正常查询使用。如何在不影响生产环境使用的情况下进入平稳删除呢。这里给大家分享一个方案,分批p平稳的进行删除呢,今天给大家分享一种比较简单操作,对实际生产使用影响较小的一种解决方式。

二、实战方案

实现思路:首先创建一个存储过程:使用了REPEAT循环来不断执行删除操作,直到库存日志表表中没有数据为止。

在每次循环中,这里使用DELETE语句结合LIMIT子句来删除每次的数据,并在每次循环后提交事务并开启新的事务。

当库存日志表中没有数据时,循环结束,并提交最后一个事务。也表示数据已经完全删除。

注意:根据实际的业务需要指定每次循环需要删除的数据个数,这里指定的为每次删除2000条数据。

具体的存储过程SQL如下:

代码语言:javascript
复制
DELIMITER //

CREATE PROCEDURE batch_delete_stocklog()
BEGIN
    DECLARE rows_affected INT;

    START TRANSACTION;

    REPEAT
        DELETE FROM t_stock_log where year(ctearDate)<=2022 ORDER BY id LIMIT 2000;
        COMMIT;  -- 提交每次删除的数据
        START TRANSACTION;  -- 开启新的事务
        SELECT COUNT(*) INTO rows_affected FROM t_stock_log where year(ctearDate)<=2022;
    UNTIL rows_affected = 0 END REPEAT;

    COMMIT;  -- 提交最后一个事务
END//

DELIMITER ;

然后执行存储过程

代码语言:javascript
复制
CALL batch_delete__stocklog();

说明:因为删除的数据量比较大有200w左右,执行时间需要和数据库本身的性能、服务器性能有关,需要耐心等待。执行完成。我这边测试五百万条数据执行了50多分钟。

三、总结

以上是使用分批删除的方式实现百万级数据删除而不影响生产环境使用的一种直接有效方式。大家如果有更好的方式欢迎补充。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、案例介绍
  • 二、实战方案
  • 三、总结
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档