MySQL 批量删除海量数据的几种方法
目录
一、问题分析
二、批量删除海量数据的几种方法
方法 1:使用 LIMIT 分批删除
方法 2:通过主键范围分批删除
方法 3:通过自定义批量删除存储过程
方法 4:创建临时表替换旧表
三、性能优化建议
总结
在数据库的日常维护中,我们经常遇到需要删除大量数据的场景。例如,删除过期日志、清理历史数据等。但如果一次性删除大量数据,可能会导致锁表、事务日志暴增、影响数据库性能等问题。本文将介绍几种高效批量删除 MySQL 海量数据的方法。
一、问题分析
一次性删除大量数据的主要问题在于:
- 长时间锁表:大量删除操作会导致数据库长时间加锁,影响其他事务的正常操作。
- 事务日志暴增:MySQL 在删除数据时会记录事务日志,大量删除操作可能导致日志文件过大,甚至撑满磁盘。
- 影响性能:一次性删除大量数据会占用大量的 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
值可以根据实际环境调整。通常500
到5000
是较合理的选择。
方法 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:创建临时表替换旧表
在某些情况下,删除大表中的大量数据可以通过创建新表的方法完成。即先将需要保留的数据转移到新表,再删除旧表。这种方法可以减少锁表时间和日志开销。
步骤:
- 创建一个新表(结构与旧表相同)。
- 将需要保留的数据插入新表。
- 删除旧表,重命名新表为原表名。
示例 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;
优点:
- 避免了大规模的删除操作,减少了锁表时间和日志。
缺点:
- 需要额外的磁盘空间来存放新表数据。
- 在业务量大的情况下,可能需要进行额外的锁机制控制。
三、性能优化建议
- 避免在业务高峰期进行大规模删除,可以选择在夜间等业务低峰期执行。
- 适当设置批量大小。批量删除时,
LIMIT
的大小需要根据实际情况调整,不宜过大,防止长时间锁表。 - 关闭不必要的日志。在某些极端情况下,可以关闭 MySQL 的二进制日志(
binlog
)来减少日志开销,但此操作有风险,应在充分了解后谨慎使用。
总结
方法 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
LIMIT 分批删除 | 需要简单分批删除 | 逻辑简单,减少锁表时间 | 需循环操作 |
主键范围分批删除 | 有连续主键的表 | 高效,无偏移开销 | 需手动指定范围 |
自定义批量删除存储过程 | 小批量删除 | 自动化操作 | 需要数据库支持存储过程 |
临时表替换 | 删除数据量非常大 | 避免锁表,减少日志开销 | 需要额外磁盘空间 |
根据不同的业务场景和需求,选择合适的批量删除方式可以提高 MySQL 的删除效率,减少对数据库的影响。希望本文对大家在 MySQL 的数据清理和维护上有所帮助!
相关文章:
MySQL 批量删除海量数据的几种方法
目录 一、问题分析 二、批量删除海量数据的几种方法 方法 1:使用 LIMIT 分批删除 方法 2:通过主键范围分批删除 方法 3:通过自定义批量删除存储过程 方法 4:创建临时表替换旧表 三、性能优化建议 总结 在数据库的日常维护…...

【docker入门】docker的安装
目录 Centos 7 添加docker 官方仓库到yum源 将 Docker 的官方镜像源替换为国内可以的 Docker 镜像源 安装docker 配置docker加速源 Ubuntu 创建 gpg key 目录 下载 gpg key 添加国内可用镜像源到 系统的 APT 仓库中 安装docker 配置加速源 Centos 7 添加docker 官方仓…...
单例模式五种写法
饿汉式(线程安全) public class Singleton {// 直接创建实例,在类加载时就完成实例化private static final Singleton instance new Singleton();// 私有构造函数private Singleton() {}// 提供公共的静态方法获取实例public static Single…...

解析静态链接
文章目录 静态链接空间与地址分配相似段合并虚拟地址分配符号地址确定 符号解析与重定位链接器优化重复代码消除函数链接级别 静态库静态链接优缺点 静态链接 一组目标文件经过链接器链接后形成的文件即可执行文件,如果没有动态库的加入,那么这个可执行…...

前端基础-html-注册界面
(200粉啦,感谢大家的关注~ 一起加油吧~) 浅浅分享下作业,大佬轻喷~ 网页最终效果: 详细代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"…...
量子电路的实现 基于ibm的qiskit
量子计算的物理实现 量子计算的实现有几种方式,最常用的就是超导量子计算机,它的量子处理器是用超导传输量子比特构建的,它是由一个约瑟夫森结和一个并联的电容器组成的电路。约瑟夫森结是一种非线性电感,由两层重叠的超导…...

关于谷歌浏览器debug模式不进断点问题解决方案
第一步.浏览器F12弹出调试者模式 第二步.点击设置齿轮,找到Ignore List,将node_model取消勾选,关闭浏览器,重新打开就进断点了...
制造行业实践|悠进电装基于超融合完成信息化改造, 保障业务系统 7/24 长跑
当一辆汽车在路上奔驰时,确保车内各种电气信号正常传递和电力供给的关键是什么?正是那不起眼却功不可没的汽车线束。这些精密编织的电线网络,犹如汽车的“神经网络”和“动脉血管”,在传递电气信号、数据的同时,源源不…...

如何学习C++游戏开发
学习C游戏开发是一个涉及多个领域的复杂过程,包括编程、游戏设计、图形学等。 1. **学习C基础**: - 掌握C的基本语法和面向对象编程。 - 学习C标准库,特别是STL(标准模板库)。 2. **理解游戏开发概念**…...

计算网络信号
题目描述: 网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。注意:网络信号可以绕过阻隔物 array[m][n]的二维数组代表网格地图, array[i][j]0代表i行j列是空旷位置&…...
【Vue 全家桶】6、vue-router 路由(更新中)
目录 相关理解基本路由嵌套路由路由传参编程式路由导航 相关理解 基本路由 嵌套路由 路由传参 编程式路由导航...

解决程序因缺少xinput1_3.dll无法运行的有效方法,有效修复丢失xinput1_3.dll
如果你的电脑在运行某些应用程序或游戏时提示“xinput1_3.dll丢失”或“找不到xinput1_3.dll”的错误消息,那么很可能是因为你的系统中缺少这个重要的DLL文件而导致的问题。那么电脑出现xinput1_3.dll丢失的问题时有哪些方法进行修复呢? 如何确定电脑是否…...
uni-popup 弹出框
:maskClick"false" 是点击空白遮罩处不关闭弹窗 <uni-popup ref"popup" type"center" :maskClick"false"> <div style"width: 80vw;padding: 0.5em;box-sizing: border-box; background-color: #fff; border-…...
Android笔记:Android中Fragment改变主题
在Android中,Fragment使用主题可以通过以下几种方法实现: 1 在onCreateView方法中设置主题: 在onCreateView方法中,可以通过创建一个ContextThemeWrapper来改变Fragment的主题。例如: @Override public View onCreateView(LayoutInflater inflater, ViewGroup co…...
GEE 训练——利用sentinel-2数据计算两栖NDVI前后差异
目录 简介 函数 expression(expression, map) Arguments: Returns: Image 代码 结果 简介 利用sentinel-2数据计算两栖NDVI前后差异 COPERNICUS/S2是欧洲空间局(ESA)的地球观测计划,旨在通过卫星遥感技术提供全球的高分辨率地球观测数据。S2是COPERNICUS地球观测计…...

看电动缸是如何提高农机的自动化水平
电动缸作为一种将电动机的旋转运动转变为推杆的直线往复运动的电力驱动装置,在提升农机自动化水平方面发挥了重要作用。以下详细分析电动缸如何提高农机的自动化水平: 一、电动缸的工作原理与优势 电动缸的工作原理是以电力作为直接动力源,采…...
C++ 并发专题 - 条件变量的使用
一:概述: 在 C 中,条件变量(std::condition_variable)是一种用于线程间同步的机制,主要用于在多线程环境中让一个线程等待某个条件满足后再继续执行。条件变量通常配合互斥锁(std::mutex&#…...
《Essential C++》学习笔记
《Essential C》这本书,是适合从C选手快速过度到C选手的 一本书,下面是个人记录 第一章:基础语法 第一章主要就是C语言基础,这里类似于表达式 数组 条件语句 循环语句,就不多概述了。 :::info vector:可动…...
揭秘!微服务架构下,Apollo 配置中心凭啥扮演关键角色?
在当今的微服务架构蓬勃发展的时代,配置中心扮演着极为关键的角色,其重要性不言而喻。今天,我们就以 Apollo 为例,聊聊配置中心在微服务架构中的重要意义。 一、微服务架构下的配置管理挑战 随着微服务架构的广泛应用࿰…...

每日OJ题_牛客_春游_贪心+数学_C++_Java
目录 牛客_春游_贪心数学 题目解析 C代码 Java代码 牛客_春游_贪心数学 春游 描述: 盼望着,盼望着,东风来了,春天脚步近了。 值此大好春光,老师组织了同学们出去划船,划船项目收费如下:…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...