MySQL 批量删除海量数据的几种方法

目录

一、问题分析

二、批量删除海量数据的几种方法

方法 1:使用 LIMIT 分批删除

方法 2:通过主键范围分批删除

方法 3:通过自定义批量删除存储过程

方法 4:创建临时表替换旧表

三、性能优化建议

总结


        在数据库的日常维护中,我们经常遇到需要删除大量数据的场景。例如,删除过期日志、清理历史数据等。但如果一次性删除大量数据,可能会导致锁表、事务日志暴增、影响数据库性能等问题。本文将介绍几种高效批量删除 MySQL 海量数据的方法。

一、问题分析

一次性删除大量数据的主要问题在于:

  1. 长时间锁表:大量删除操作会导致数据库长时间加锁,影响其他事务的正常操作。
  2. 事务日志暴增:MySQL 在删除数据时会记录事务日志,大量删除操作可能导致日志文件过大,甚至撑满磁盘。
  3. 影响性能:一次性删除大量数据会占用大量的 CPU 和 IO 资源,对数据库整体性能产生严重影响。

为避免这些问题,可以考虑分批删除等策略来减少对数据库的压力。

二、批量删除海量数据的几种方法

方法 1:使用 LIMIT 分批删除

LIMIT 分批删除是一种常用的处理海量数据的方式。每次删除固定数量的数据,循环执行,直至删除完毕。

示例 SQL:

假设我们要删除 logs 表中创建时间在某个日期之前的所有数据:

-- 设置每批删除的行数
SET @BATCH_SIZE = 1000;-- 分批删除符合条件的数据
DELETE FROM logs 
WHERE create_time < '2023-01-01' 
LIMIT @BATCH_SIZE;

可以将上述语句放入存储过程或在应用层循环调用。每次删除 BATCH_SIZE 行数据,减少锁表时间和日志生成量。

优点:
  • 控制单次删除的量,减少锁表时间和日志生成量。
缺点:
  • 需要循环多次操作,逻辑稍复杂。
注意:
  • 分批删除的 LIMIT 值可以根据实际环境调整。通常 5005000 是较合理的选择。

方法 2:通过主键范围分批删除

如果要删除的数据在主键上是连续的(如自增 ID),可以按主键范围分批删除。这样能够避免 LIMIT 的偏移开销,提高删除效率。

示例 SQL:

假设 logs 表的主键是 id

-- 设置每批删除的范围
SET @start_id = 0;
SET @end_id = 1000;WHILE (@start_id < (SELECT MAX(id) FROM logs WHERE create_time < '2023-01-01')) DODELETE FROM logsWHERE id BETWEEN @start_id AND @end_idAND create_time < '2023-01-01';-- 更新删除范围SET @start_id = @end_id + 1;SET @end_id = @end_id + 1000;
END WHILE;
优点:
  • 主键范围分批避免了 LIMIT 偏移带来的开销。
缺点:
  • 需要知道主键范围,且适用于有连续主键的数据表。

方法 3:通过自定义批量删除存储过程

可以将批量删除逻辑封装成存储过程,利用存储过程自动控制批量删除过程。

示例 SQL:
DELIMITER $$CREATE PROCEDURE batch_delete_logs()
BEGINDECLARE done INT DEFAULT FALSE;DECLARE batch_size INT DEFAULT 1000;WHILE NOT done DODELETE FROM logs WHERE create_time < '2023-01-01' LIMIT batch_size;-- 检查是否还有剩余数据IF ROW_COUNT() < batch_size THENSET done = TRUE;END IF;END WHILE;
END $$DELIMITER ;

执行存储过程:

CALL batch_delete_logs();
优点:
  • 存储过程实现自动化,逻辑清晰,避免多次手动执行 SQL。
缺点:
  • 适用于支持存储过程的场景,对小批量删除非常适合。

方法 4:创建临时表替换旧表

在某些情况下,删除大表中的大量数据可以通过创建新表的方法完成。即先将需要保留的数据转移到新表,再删除旧表。这种方法可以减少锁表时间和日志开销。

步骤:
  1. 创建一个新表(结构与旧表相同)。
  2. 将需要保留的数据插入新表。
  3. 删除旧表,重命名新表为原表名。
示例 SQL:
-- 创建新表
CREATE TABLE logs_new LIKE logs;-- 插入需要保留的数据
INSERT INTO logs_new
SELECT * FROM logs WHERE create_time >= '2023-01-01';-- 删除旧表并重命名新表
DROP TABLE logs;
RENAME TABLE logs_new TO logs;
优点:
  • 避免了大规模的删除操作,减少了锁表时间和日志。
缺点:
  • 需要额外的磁盘空间来存放新表数据。
  • 在业务量大的情况下,可能需要进行额外的锁机制控制。

三、性能优化建议

  1. 避免在业务高峰期进行大规模删除,可以选择在夜间等业务低峰期执行。
  2. 适当设置批量大小。批量删除时,LIMIT 的大小需要根据实际情况调整,不宜过大,防止长时间锁表。
  3. 关闭不必要的日志。在某些极端情况下,可以关闭 MySQL 的二进制日志(binlog)来减少日志开销,但此操作有风险,应在充分了解后谨慎使用。

总结

方法适用场景优点缺点
LIMIT 分批删除需要简单分批删除逻辑简单,减少锁表时间需循环操作
主键范围分批删除有连续主键的表高效,无偏移开销需手动指定范围
自定义批量删除存储过程小批量删除自动化操作需要数据库支持存储过程
临时表替换删除数据量非常大避免锁表,减少日志开销需要额外磁盘空间

根据不同的业务场景和需求,选择合适的批量删除方式可以提高 MySQL 的删除效率,减少对数据库的影响。希望本文对大家在 MySQL 的数据清理和维护上有所帮助!

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

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

相关文章

开启鸿蒙开发之旅:准备篇

写在前面 Q:为什么要学习鸿蒙&#xff1f; A:没有特定的理由&#xff0c;有可能是因为大环境不好的原因&#xff0c;大家越来越卷&#xff0c;技术革新越来越快&#xff0c;如果手里多掌握一门技术&#xff0c;心里会更有底气一些。再一个自己只有前端开发经验&#xff0c;平时…

倒计时3天 | 2024 CCF中国开源大会仪式解读

点击蓝字 关注我们 CCF Opensource Development Committee CCF 大会简介 2024 CCF中国开源大会&#xff08;CCF ChinaOSC&#xff09;将于2024年11月9日至10日在深圳召开。本届大会由中国计算机学会主办&#xff0c;CCF开源发展委员会、鹏城实验室、新一代人工智能产业技术创新…

硬件基础17 半导体存储器——随机存取存储器RAM

目录 一、异步SRAM 二、同步SRAM 三、DRAM 四、字长位数扩展 五、字数的扩展 RAM是另一大类存储器&#xff0c;它与ROM的最大区别就是数据易失性&#xff0c;一旦失去电源供电&#xff0c;所存储的数据立即丢失。最大优点是可以随时快速地从其中任一指定地址读出&#xff…

安装VMware Tools选项显示灰色以及连接不上服务器,下载出错的正确解决办法

1.显示灰色解决办法&#xff1a; 解决办法&#xff1a; 关闭虚拟机 选择“虚拟机设置”&#xff0c;分别添加一个“软盘”和一个“CD/DVD”&#xff0c;并将所有软盘和CD/DVD&#xff08;包括自带的&#xff09;“连接”选项全部更改为“使用物理驱动器” 2.关闭虚拟机重启即…

git中使用tag(标签)的方法及重要性

在Git中打标签&#xff08;tag&#xff09;通常用于标记发布版本或其他重要提交。 Git中打标签的步骤&#xff1a; 列出当前所有的标签 git tag创建一个指向特定提交的标签 git tag <tagname> <commit-hash>创建一个带注释的标签&#xff0c;通常用于发布版本 git…

BMC运维管理:IPMI实现服务器远控制

IPMI实现服务器远控制 实操一、使用IPMI重置BMC用户密码实操二、使用IPMI配置BMC的静态IP实操三、IPMI实现BMC和主机控制操作实操四、ipmitool查看服务器基本信息实操五、ipmitool实现问题定位BMC(Baseboard Management Controller,基板管理控制器)是服务器硬件的一个独立管…

Android Profiler 内存分析

Android studio&#xff08;下面简称AS&#xff09;为App提供的性能分析工具&#xff0c;在AS3.0替换掉旧的分析工具&#xff0c;对于其使用方法&#xff0c;官方也有对应的介绍&#xff1a;Android Profiler 对于使用方法&#xff0c;我只用到比较简单的功能&#xff0c;高级的…

vue3 基于element-plus进行的一个可拖动改变导航与内容区域大小的简单方法

1、先上个截图&#xff1a; 说明&#xff1a;拖动上面的分隔栏就可以实现&#xff0c;改变左右区域的大小。 2、上面的例子来自官网的&#xff1a; Container 布局容器 | Element Plus 3、拖动的效果来自&#xff1a; https://juejin.cn/post/7029640316999172104#heading-1…

adminPage-vue3依赖DetailsModule版本说明:V1.2.1——1) - 新增span与labelSpan属性

文章目录 更新内容DetailsModuleAPI汇总属性自定义对象config.list(array<object> 类型) 使用span属性&#xff08;24栅格系统&#xff09; 更新内容 新增span与labelSpan属性&#xff0c;当使用span属性时将不适用默认的布局&#xff0c;如果24栅格系统进行重新布局 D…

系统聚类的分类数确定——聚合系数法

breast_cancer数据集分析——乳腺癌诊断 #读取乳腺癌数据 import pandas as pd import numpy as np from sklearn.datasets import load_breast_cancer data load_breast_cancer() X data.data y data.target.. _breast_cancer_dataset:Breast cancer wisconsin (diagnosti…

Android 实现柱形图

在 Android 中实现柱状图&#xff0c;可以使用流行的图表库 MPAndroidChart&#xff0c;它支持多种类型的图表&#xff0c;包括柱状图、折线图、饼图等。下面是一个基本的柱状图实现步骤&#xff0c;具体分为以下几个部分&#xff1a; 1. 添加依赖 首先&#xff0c;你需要在 …

dolphin 配置data 从文件导入hive 实践(一)

datax 支持多种数据源的相互读写&#xff0c;作为开源软件&#xff0c;提供了离线采集功能&#xff0c;方便系统开发&#xff0c;过程中遇到诸多配置&#xff0c;需要开发者自己探索&#xff0c;免费同样有成本 配置模板 {"setting": {},"job": {"s…

AUTOSAR CP Ethernet State Manager(EthSM)规范的主要功能以及工作原理导读

AUTOSAR Ethernet State Manager&#xff08;以下简称EthSM&#xff09;规范的主要功能 AUTOSAR Ethernet State Manager&#xff08;以下简称EthSM&#xff09;规范的主要功能包括&#xff1a; 通信控制 网络模式管理&#xff1a;为通信管理器&#xff08;ComM&#xff09;提…

深度学习中的感受野:从基础概念到多层次特征提取

在深度学习&#xff0c;特别是计算机视觉任务中&#xff0c;感受野&#xff08;Receptive Field&#xff09;是一个至关重要的概念。它指的是在神经网络中某一层的神经元在输入图像上“看到”的区域大小。感受野的大小影响了网络能捕捉的特征层级&#xff0c;从而决定了它的特征…

VirtIO实现原理(1)

本文内容参考: VirtIO实现原理——PCI基础_virtio-pci-CSDN博客 QEMU源码全解析 —— virtio(3)_qemu virtio block bus-CSDN博客 特此致谢! 序言 本系列文章是笔者在看了网名为“享乐主”的VirtIO系列文章后决心要写的。这位博主的“VirtIO专栏”中博文的内容从技术层…

2024年双11激光投影仪哪个品牌最好?当贝新品震撼视觉的秘密武器

激光投影仪逐渐占据家庭娱乐生活的中心位置&#xff0c;以其超大屏优势与卓越的性能获得了众多消费者的青睐。双11购物狂欢节期间&#xff0c;正是入手一台高品质激光投影仪的好时机&#xff0c;各大厂商也纷纷推出了品牌新品&#xff0c;2024年双11激光投影仪怎么选&#xff1…

React的概念以及发展前景如何?

React是一个由Facebook开发的用于构建用户界面的的开源JavaScript库&#xff0c;它主要用于构建大型、动态的Web应用程序。React的主要特点是使用VirtualDOM&#xff08;虚拟DOM&#xff09;来优化性能&#xff0c;并使用声明式的编程方式来编写UI。 React的主要概念包括&#…

定位,堆叠,CSS精灵,过渡,光标(前端)

一.定位 1.作用 灵活改变盒子在网页中的位置 2.标签 position 3.属性值 &#xff08;1&#xff09;相对定位relative relative&#xff08;相对定位&#xff09;-----改变位置的参照物是原来的位置&#xff0c;挪动后原来的位置不托标&#xff0c;不被占用。 要配合top…

2024-11-01 - 统一身份认证 - OpenLdap - 中间件 - 流雨声

摘要 2024-11-01 周五 杭州 暴雨 调查问卷: https://www.wjx.cn/vm/exIBFDM.aspx# 2024年转瞬即逝&#xff0c;可是生活还在继续&#xff0c;这里有一项关于人工智能和项目管理对于效能关系的调研问卷&#xff0c;AI 对工作的作用和影响。问卷不采集个人信息&#xff0c;在此…

【363】基于springboot的高校竞赛管理系统

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统高校竞赛管理系统信息管理难度大&#xff0c;容错率低&am…