Mysql大数据量删除

Mysql大数据量删除

在一些操作中,可能需要清理一下积压的数据,如果数据量小的话自然没有问题,但是如果是个大数据量的问题,那么就该考虑一个合适的办法了。
在清理大数据量的时候需要考虑是清理部分数据还是清理所有数据,这两种场景有着不同的策略。
注意:本次测试与方法均针对mysql5.7,存储引擎为InnoDB

清理表中的所有数据

清空表数据,建议直接使用truncate,效率上truncate远高于delete,truncate不走事务,不会锁表,也不会产生大量日志写入日志文件,我们访问log执行日志可以发现每次delete都有记录。truncate table table_name 会立刻释放磁盘空间,并重置auto_increment的值,delete 删除不释放磁盘空间,insert会覆盖之前的数据上,因为我们创建表的时候有一个创建版本号。
delete删除数据的原理:(delete属于DML语句)
表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不会被释放!!!
这种删除表的优点是:支持回滚,后悔了可以恢复数据,可以删除单条数据
缺点:删除效率比较低

效率比较高,表被一次截断,物理删除
优点:快速,不走事务,不会锁表,也不会产生大量日志写入日志文件
缺点:不支持回滚,只能删除表中所有数据,不能删单条数据
如果说公司项目里面有一张大表,数据非常多,几亿条记录:
删除的时候,使用delete,也许执行一个小时才能删除完,效率极其低;
可以选择使用truncate删除表中的数据。只需要不到1s的时间就能删除结束,效率较高。
但是使用truncate之前,必须仔细询问客户是否真的需要删除,并警告删除之后不可恢复!!!

删除表操作:
drop table 表名;// 删除表,不是删除表中的数据

清理表中部分数据

情景一:如果删除的数据占据表的绝大部分

这是mysql官方文档中提到的一种情形,这里直接复制过来
https://dev.mysql.com/doc/refman/8.0/en/delete.html
如果要从大型表中删除许多行,则可能会超出表的锁定表大小InnoDB。为了避免这个问题,或者只是为了最大限度地减少表保持锁定的时间,以下策略(根本不使用 DELETE)可能会有所帮助:
选择不需要删除的行到一个与原表结构相同的空表中:
INSERT INTO t_copy SELECT * FROM t WHERE … ;
用于RENAME TABLE以原子方式将原始表移开并将副本重命名为原始名称:
RENAME TABLE t TO t_old, t_copy TO t;
删除原始表:
DROP TABLE t_old;
总体来说就是:建立一个相同的表,把不删除得数据复制的新表,然后将表重命名倒换,最后删掉旧表

情形二:数据是主键索引

删除大表的多行数据时,会超出innod block table size的限制,最小化的减少锁表的时间的方案是:
1、选择不需要删除的数据,并把它们存在一张相同结构的空表里
2、重命名原始表,并给新表命名为原始表的原始表名
3、删掉原始表

每次删除固定的数据量

批量删除(每次限定一定数量),然后循环删除直到全部数据删除完毕;同时key_buffer_size 由默认的8M提高到512M
DELETE FROM test_table WHERE value=12;
如果要用order by 必须要和 limit 联用,否则被优化掉。然后分多次执行就可以把这些记录成功删除。
注意:
执行大批量删除的时候注意要使用上limit。因为如果不用limit,删除大量数据很有可能造成死锁。
如果delete的where语句不在索引上,可以先找主键,然后根据主键删除数据库。
平时update和delete的时候最好也加上limit 1 来防止误操作。

暂时删除索引

在My SQL数据库使用中,有的表存储数据量比较大,达到每天三百万条记录左右,此表中建立了三个索引,这些索引都是必须的,其他程序要使用。由于要求此表中的数据只保留当天的数据,所以每当在凌晨的某一时刻当其他程序处理完其中的数据后要删除该表中昨天以及以前的数据,使用delete删除表中的上百万条记录时,MySQL删除速度非常缓慢,每一万条记录需要大概4分钟左右,这样删除所有无用数据要达到八个小时以上,这是难以接受的。
查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的,于是删除掉其中的两个索引后测试,发现此时删除速度相当快,一百万条记录在一分钟多一些,可是这两个索引其他模块在每天一次的数据整理中还要使用,于是想到了一个折中的办法:
在删除数据之前删除这两个索引,此时需要三分钟多一些,然后删除其中无用数据,此过程需要不到两分钟,删除完成后重新创建索引,因为此时数据库中的数据相对较少,约三四十万条记录(此表中的数据每小时会增加约十万条),创建索引也非常快,约十分钟左右。这样整个删除过程只需要约15分钟。对比之前的八个小时,大大节省了时间。

强制指定索引

分表

如果数据量过大,可以考虑分表,这个分表策越需要根据实际情况来决定,比如每月建立一个表,这个表只存储当月的数据,下个月之后直接将此表truncate。

表分区,直接删除过期日期所在的分区

官方文档 https://dev.mysql.com/doc/refman/5.7/en/alter-table-partition-operations.html
MySQL表分区有几种方式,包括RANGE、KEY、LIST、HASH,详情请参见官方文档。应用场景:日期在变化,所以不适合用RANGE设置固定的分区名称,HASH分区更符合此处场景
分区表定义,SQL语句如下:
ALTER TABLE table_name PARTITION BY HASH(TO_DAYS(cnt_date)) PARTITIONS 7;
TO_DAYS将日期(必须为日期类型,否则会报错:Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed)转换为天数(年月日总共的天数),然后HASH;建立7个分区。实际上,就是 days MOD 7 。

异步删除

前置数据

在这之前首先要建立一个存储过程可表来做测试
建立一个表:

CREATE TABLE test_table (starttime DATETIME,endtime DATETIME,resourceid INT,value INT,PRIMARY KEY (resourceid),INDEX idx_starttime_endtime_resourceid (starttime, endtime, resourceid)
);

定义了主键 resourceid,通过 PRIMARY KEY 关键字指定。

然后,我们使用 INDEX 关键字创建了一个名为 idx_starttime_endtime_resourceid 的联合索引,该索引包含了 starttime、endtime 和 resourceid 列。注意,INDEX 关键字在MySQL中用于创建普通索引。

DELIMITER //CREATE PROCEDURE insert_data(IN num_records_to_generate INT)
BEGINDECLARE i INT DEFAULT 1;DECLARE start_time DATETIME DEFAULT '2023-06-29 00:00:00';WHILE i <= num_records_to_generate DOINSERT INTO test_table (starttime, endtime,   value)VALUES (start_time, DATE_ADD(start_time, INTERVAL 1 SECOND), 12);SET start_time = DATE_ADD(start_time, INTERVAL 1 SECOND);SET i = i + 1;END WHILE;
END //DELIMITER ;

在这个存储过程中,是以endtime作为变量来测试的。
调用方式为
call inser_data(插入数目)

mysql> call insert_data(1000);
Query OK, 1 row affected (4.18 sec)
mysql> select count(*) from test_table;
+----------+
| count(*) |
+----------+
|     1000 |
+----------+
1 row in set (0.00 s

引用文献

https://blog.csdn.net/jike11231/article/details/126551510
https://www.cnblogs.com/NaughtyCat/p/one-fast-way-to-delete-huge-data-in-mysql.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/203393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微服务】分布式限流如何实现

Sentinel 是一款阿里巴巴开源的分布式系统级流量控制组件&#xff0c;它提供了流量的自适应控制、熔断降级、系统负载保护等功能。下面是使用 Sentinel 实现分布式限流方案的基本步骤&#xff1a; 引入 Sentinel 依赖&#xff1a;首先在你的 Java 项目中引入 Sentinel 的相关依…

Stm32_串口的帧(不定长)数据接收

目录标题 前言1、串口中断接收固定帧头帧尾数据1.1、任务需求1.2、实现思路1.3、程序源码&#xff1a; 2、串口中断接收用定时器来判断帧结束3、串口中断接收数据空闲中断3.1、串口的空闲中断3.2、实现思路3.3、程序源码 4、串口的空闲中断DMA转运4.1、DMA简介4.2、DMA模式4.3、…

AHB 与 DMA

AHB&#xff08;先进高性能总线&#xff09; 随着深亚微米工艺技术日益成熟&#xff0c;集成电路芯片的规模越来越大。数字IC从基于时序驱动的设计方法&#xff0c;发展到基于IP核复用的设计方法&#xff0c;并在SOC设计中得到了广泛应用。在基于IP核复用的SoC&#xff08;Syst…

【BME2112】w11 notes

下周做老鼠实验 group analysis SPM group analysis 数据地址resting state 可以分析&#xff1a;correlation 计算两个脑区的相关性 静息态实验简单functional 成功的实验能看到激活区不成功的实验&#xff1a;比如被试头动太大&#xff0c;不是健康的被试 Spontaneous brain…

ThreeJs中使用Cannon实现方块自由落体效果

之前有做过小球的掉落效果&#xff0c;不过那个从画面上只能看出来重力加速度和接触地面反弹的效果&#xff0c;可能没有那么直观&#xff0c;也许用一些js加物理公式也能实现类似的效果&#xff0c;这节用小方块来演示&#xff0c;可以很直观的看出物理世界的现象&#xff0c;…

ALPHA开发板烧录工具MfgTool烧写方法

一. 简介 MfgTool 工具是 NXP 提供的专门用于给 I.MX 系列 CPU 烧写系统的软件&#xff0c;可以在 NXP 官网下载到。运行在windows下。可以烧写uboot.imx、zImage、dtb&#xff0c;rootfs。通过 USB口进行烧写。 上一篇文章简单了解了 ALPHA开发板烧录工具MfgTool。文章地址…

数据结构之交换排序

目录 交换排序 冒泡排序 冒泡排序的时间复杂度 快速排序 快速排序单趟排序的时间复杂度 快速排序的时间复杂度 交换排序 在日常生活中交换排序的使用场景是很多的&#xff0c;比如在学校做早操&#xff0c;老师通常会让学生按大小个排队&#xff0c;如果此时来了一个新学…

MySQL系列(一):索引篇

为什么是B树&#xff1f; 我们推导下&#xff0c;首先看下用哈希表做索引&#xff0c;是否可以满足需求。如果我们用哈希建了索引&#xff0c;那么对于如下这种SQL&#xff0c;通过哈希&#xff0c;可以快速检索出数据&#xff1a; select * from t_user_info where id1;但是这…

ThreadX开源助力Microsoft扩大应用范围:对比亚马逊AWS的策略差异

全球超过120亿台设备正在运行ThreadX&#xff0c;这是一款专为资源受限环境设计的实时操作系统。该操作系统在微控制器和小型处理器上表现出色&#xff0c;以极高的可靠性和精确的时间控制处理任务而闻名。 ThreadX曾是英特尔芯片管理引擎的引擎&#xff0c;并且是控制Raspber…

JavaScript 宿主对象

JavaScript 宿主对象 BOM window 全局对象 window对象是可以直接被访问到的每一个用var声明的变量都会自动作为window对象的属性存在 function声明的函数也会自动作为window对象的方法存在访问window对象的属性和方法可以不用写window 属性 innerWidth 获取浏览器窗口的宽度…

AWS基于x86 vs Graviton(ARM)的RDS MySQL性能对比

概述 这是一个系列。在前面&#xff0c;我们测试了阿里云经济版&#xff08;“ARM”&#xff09;与标准版的性能/价格对比&#xff1b;华为云x86规格与ARM&#xff08;鲲鹏增强&#xff09;版的性能/价格对比。现在&#xff0c;再来看看AWS的ARM版本的RDS情况 在2018年&#…

User: zhangflink is not allowed to impersonate zhangflink

使用hive2连接进行添加数据是报错&#xff1a; [08S01][1] Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. User: zhangflink is not allowed to impersonate zhangflink 有些文章说需要修…

配置OSS后如何将服务器已有文件上传至OSS,推荐使用ossutil使用

1.下载安装ossutil sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash2.交互式配置生成配置文件 ossutil config 根据提示分别设置配置文件路径、设置工具的语言、Endpoint、AccessKey ID、AccessKey Secret和STSToken参数&#xff0c;STSToken留…

自定义BeanPostProcessor之Feign组件服务间优雅调用

Feign是什么 feign是声明式的web service客户端&#xff0c;它让微服务之间的调用变得更简单了&#xff0c;类似controller调用service。Spring Cloud集成了Ribbon和Eureka&#xff0c;可在使用Feign时提供负载均衡的http客户端。 Feign怎么使用 FeignClient(value "s…

【Axure高保真原型】个性化自定义图片显示列表

今天和大家分享个性化自定义图片显示列表的原型模板&#xff0c;鼠标点击多选按钮&#xff0c;可以切换按钮选中或者取消选中&#xff0c;按钮选中时&#xff0c;对应图片会在列表中显示&#xff0c;按钮取消后&#xff0c;对应图片会自动隐藏。那这个模板是用中继器制作的&…

系统设计-缓存介绍

该图说明了我们在典型架构中缓存数据的位置。 沿着流程有多个层次。 客户端应用程序&#xff1a;HTTP 响应可以由浏览器缓存。我们第一次通过 HTTP 请求数据&#xff0c;返回时在 HTTP 标头中包含过期策略&#xff1b;我们再次请求数据&#xff0c;客户端应用程序首先尝试从浏…

前端实现检索文本高亮实现

文章目录 一、前言二、实现三、最后 一、前言 使用搜索引擎时的搜索结果高亮&#xff0c;搜索文本在查询出来的结果内高亮显示&#xff0c;这种在全文检索应该很常见 二、实现 看了下百度检索的实现&#xff0c;是给内容加上了em标签&#xff0c;然后给em标签设置颜色&#x…

机器的深度强化学习算法可以被诱导

设计一个好的奖励函数是机器深度强化学习算法的关键之一。奖励函数用于给予智能体&#xff08;机器&#xff09;在环境中采取不同行动时的反馈信号&#xff0c;以指导其学习过程。一个好的奖励函数应该能够引导智能体朝着期望的行为方向学习&#xff0c;并尽量避免潜在的问题&a…

Gitlab 安装手册

MD[Gitlab 安装手册] Gitlab 安装手册 说明: Gitlab最低配置1核2g,建议配置2核4g以上且单独部署,如有多项目CI/CD要求,可以4核8g 1. 安装相关依赖(安装policycoreutils) [rootsjclinux ~]# yum -y install policycoreutils openssh-server openssh-clients postfix 2. 启动s…

区块链密码学:基础知识、应用与未来发展

一、引言 区块链技术&#xff0c;作为一种分布式、去中心化的数据管理方式&#xff0c;密码学在其安全性和可靠性方面发挥着至关重要的作用。本文将详细介绍区块链密码学的基础知识、应用以及未来发展趋势。 二、区块链密码学基础知识 区块链密码学是区块链技术的核心组成部分…