百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

MYSQL千万级大表如何做数据清理?

ztj100 2025-02-13 15:16 44 浏览 0 评论

前言:

mysql数据库表数据的清理,在工作中我们会经常遇见,那么对于千万级大表数据的清理还是按照常规的使用delete命令来清理吗?下面就聊一聊千万级数据如何清理。

数据清理

当我们要清理表中的历史数据时,一般都是通过时间来进行判断的,执行delete的语句如下“

DELETE FRoM table useronline  WHERE gmt_create < SUBDATE(CURDATE(),INTERVAL 300 DAY);

如上SQL,就是删除300天之前的数据,如果是小表的话,执行这个SQL没啥问题,但是如果是大表,如果表中的数据量达到千万级别的话,就会有问题了

像以上这样的SQL,如果没有在gmt_create字段上创建索引,那么delete操作就会进行全表扫描,进行大范围的加锁,甚至效果相当于锁表,而锁表给业务带来的影响就是业务都无法进行写操作了,这肯定是无法接受的。

而且,即使业务说我可以允许锁表上面的操作也有可能会失败,因为数据库会对单条SQL产生的bin log有大小是有限制的,删除这么大量的数据,产生的日志大小如果超过该阈值,最终还是会失败!

max_binlog_cache_size参数指定了单个事务最大允许使用的Binlog,当超出这个值会出现报错:Multi-statement transaction required more than时,'max binlog cache size' bytes of storage; increase this mysqld variable andtry again.

而且,删除操作还涉及到磁盘I0,如果要删除的数据太多,就会导致频繁的I0,对数据也会造成一定的压力。

还有就是,数据的删除过程,也会伴随着索引更新,大量的数据删除操作,会因为频繁的索引重建而导致业务无法进行写操作。

那么,怎么解决呢?如何实现高效、安全的大表的批量删除呢?

总的清理方案可以参考:删除历史数据_数据管理(DMS)-阿里云帮助中心 (aliyun.com):
https://help.aliyun.com/zh/dms/clear-historical-data

DMS在清理数据时会扫描全表,根据主键或非空唯一键分批执行。

1、获取要做数据清理的表的主键,或者非空唯一键的最大值和最小值,

如:

select min(id) as min_id,max(id) as max_id from useronlinetable

假如我们得到min_id = 100,max_id=100000;

2、分段取出第一个区间的所有数据,默认区间可能是1000,也可以根据binlog配置等进行调整

这段 SQL代码的主要目的是查询出表useronline中 id值在 100 到 100000 之间的记录,并为每条记录增加一个额外的字段 hasNeedDelItem 。这个字段用于标识是否存在一个条件满足的记录。以下是详细的逐步解析:

外层查询:

这部分查询 table_hollis 表中 id 在100 到 100000 范围内的前 1000 条记录。查询的结果包括每条记录的 id 和一个名为hasNeedDelItem的计算字段。

内层查询:(计算字段hasNeedDelItem)

子查询:

select gmt_create from username where id >= 100 and id <= 100000 order by id asc limit 1000

这个子查询从同样的 table hollis 表中选取 id 在同一范围内的记录,并提取这些记录的 gmt_ creare字段。结果集限制为前 1000 条记录。

条件查询:

在子查询结果的基础上,这个条件进一步检查gmt create 是否小于当前日期向前推算 300 天的日期。这里使用的 SUBDATE 函数用于日期的计算。

最终解释:

如果找到任何 gmt_create满足上述条件的记录,这个查询就返回数字1。由于使用了 limit 1,查询最多返回一条记录。如果没有找到任何符合条件的记录,则不返回任何结果。

结果解释:

hasNeedDelItem 字段对于每个符合外层查询条件的id,都会检查是否存在gmt create 日期小于当前日期 300 天的记录。如果存在, hasNeedDelItem 为1(即记录需要被删除的标识),否则为 NULL(因为没有记录返回1)。

这样的 SOL逻辑通常用于标记或检索需要基于某些时间条件进行处理或删除的数据记录。

这样,在按照ID删除的时候,就可以用到主键索引,进行删除,而且因为做了分批,也不会一次性删除大量数据。

总结

在阿里云MDS的数据清理功能中,还可以设置开始执行时间和结束执行时间,只有在这个时间范围内才会执行,如果超过了这个时间,就不再执行了。也可以避免数据清理导致线上数据库不可用!

相关推荐

30天学会Python编程:16. Python常用标准库使用教程

16.1collections模块16.1.1高级数据结构16.1.2示例...

强烈推荐!Python 这个宝藏库 re 正则匹配

Python的re模块(RegularExpression正则表达式)提供各种正则表达式的匹配操作。...

Python爬虫中正则表达式的用法,只讲如何应用,不讲原理

Python爬虫:正则的用法(非原理)。大家好,这节课给大家讲正则的实际用法,不讲原理,通俗易懂的讲如何用正则抓取内容。·导入re库,这里是需要从html这段字符串中提取出中间的那几个文字。实例一个对...

Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)

实现功能:Python数据分析实战-利用正则表达式提取文本中的URL网址和邮箱...

python爬虫教程之爬取当当网 Top 500 本五星好评书籍

我们使用requests和re来写一个爬虫作为一个爱看书的你(说的跟真的似的)怎么能发现好书呢?所以我们爬取当当网的前500本好五星评书籍怎么样?ok接下来就是学习python的正确姿...

深入理解re模块:Python中的正则表达式神器解析

在Python中,"re"是一个强大的模块,用于处理正则表达式(regularexpressions)。正则表达式是一种强大的文本模式匹配工具,用于在字符串中查找、替换或提取特定模式...

如何使用正则表达式和 Python 匹配不以模式开头的字符串

需要在Python中使用正则表达式来匹配不以给定模式开头的字符串吗?如果是这样,你可以使用下面的语法来查找所有的字符串,除了那些不以https开始的字符串。r"^(?!https).*&...

先Mark后用!8分钟读懂 Python 性能优化

从本文总结了Python开发时,遇到的性能优化问题的定位和解决。概述:性能优化的原则——优化需要优化的部分。性能优化的一般步骤:首先,让你的程序跑起来结果一切正常。然后,运行这个结果正常的代码,看看它...

Python“三步”即可爬取,毋庸置疑

声明:本实例仅供学习,切忌遵守robots协议,请不要使用多线程等方式频繁访问网站。#第一步导入模块importreimportrequests#第二步获取你想爬取的网页地址,发送请求,获取网页内...

简单学Python——re库(正则表达式)2(split、findall、和sub)

1、split():分割字符串,返回列表语法:re.split('分隔符','目标字符串')例如:importrere.split(',','...

Lavazza拉瓦萨再度牵手上海大师赛

阅读此文前,麻烦您点击一下“关注”,方便您进行讨论和分享。Lavazza拉瓦萨再度牵手上海大师赛标题:2024上海大师赛:网球与咖啡的浪漫邂逅在2024年的上海劳力士大师赛上,拉瓦萨咖啡再次成为官...

ArkUI-X构建Android平台AAR及使用

本教程主要讲述如何利用ArkUI-XSDK完成AndroidAAR开发,实现基于ArkTS的声明式开发范式在android平台显示。包括:1.跨平台Library工程开发介绍...

Deepseek写歌详细教程(怎样用deepseek写歌功能)

以下为结合DeepSeek及相关工具实现AI写歌的详细教程,涵盖作词、作曲、演唱全流程:一、核心流程三步法1.AI生成歌词-打开DeepSeek(网页/APP/API),使用结构化提示词生成歌词:...

“AI说唱解说影视”走红,“零基础入行”靠谱吗?本报记者实测

“手里翻找冻鱼,精心的布局;老漠却不言语,脸上带笑意……”《狂飙》剧情被写成歌词,再配上“科目三”背景音乐的演唱,这段1分钟30秒的视频受到了无数网友的点赞。最近一段时间随着AI技术的发展,说唱解说影...

AI音乐制作神器揭秘!3款工具让你秒变高手

在音乐创作的领域里,每个人都有一颗想要成为大师的心。但是面对复杂的乐理知识和繁复的制作过程,许多人的热情被一点点消磨。...

取消回复欢迎 发表评论: