当前位置: 首页 > news >正文

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 的数据清理和维护上有所帮助!

相关文章:

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

目录 一、问题分析 二、批量删除海量数据的几种方法 方法 1&#xff1a;使用 LIMIT 分批删除 方法 2&#xff1a;通过主键范围分批删除 方法 3&#xff1a;通过自定义批量删除存储过程 方法 4&#xff1a;创建临时表替换旧表 三、性能优化建议 总结 在数据库的日常维护…...

【docker入门】docker的安装

目录 Centos 7 添加docker 官方仓库到yum源 将 Docker 的官方镜像源替换为国内可以的 Docker 镜像源 安装docker 配置docker加速源 Ubuntu 创建 gpg key 目录 下载 gpg key 添加国内可用镜像源到 系统的 APT 仓库中 安装docker 配置加速源 Centos 7 添加docker 官方仓…...

单例模式五种写法

饿汉式&#xff08;线程安全&#xff09; public class Singleton {// 直接创建实例&#xff0c;在类加载时就完成实例化private static final Singleton instance new Singleton();// 私有构造函数private Singleton() {}// 提供公共的静态方法获取实例public static Single…...

解析静态链接

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

前端基础-html-注册界面

&#xff08;200粉啦&#xff0c;感谢大家的关注~ 一起加油吧~&#xff09; 浅浅分享下作业&#xff0c;大佬轻喷~ 网页最终效果&#xff1a; 详细代码&#xff1a; ​ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"…...

量子电路的实现 基于ibm的qiskit

量子计算的物理实现 量子计算的实现有几种方式&#xff0c;最常用的就是超导量子计算机&#xff0c;它的量子处理器是用超导传输量子比特构建的&#xff0c;它是由一个约瑟夫森结和一个并联的电容器组成的电路。约瑟夫森结是一种非线性电感&#xff0c;由两层重叠的超导…...

关于谷歌浏览器debug模式不进断点问题解决方案

第一步.浏览器F12弹出调试者模式 第二步.点击设置齿轮&#xff0c;找到Ignore List,将node_model取消勾选&#xff0c;关闭浏览器&#xff0c;重新打开就进断点了...

制造行业实践|悠进电装基于超融合完成信息化改造, 保障业务系统 7/24 长跑

当一辆汽车在路上奔驰时&#xff0c;确保车内各种电气信号正常传递和电力供给的关键是什么&#xff1f;正是那不起眼却功不可没的汽车线束。这些精密编织的电线网络&#xff0c;犹如汽车的“神经网络”和“动脉血管”&#xff0c;在传递电气信号、数据的同时&#xff0c;源源不…...

如何学习C++游戏开发

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

计算网络信号

题目描述&#xff1a; 网络信号经过传递会逐层衰减&#xff0c;且遇到阻隔物无法直接穿透&#xff0c;在此情况下需要计算某个位置的网络信号值。注意&#xff1a;网络信号可以绕过阻隔物 array[m][n]的二维数组代表网格地图&#xff0c; array[i][j]0代表i行j列是空旷位置&…...

【Vue 全家桶】6、vue-router 路由(更新中)

目录 相关理解基本路由嵌套路由路由传参编程式路由导航 相关理解 基本路由 嵌套路由 路由传参 编程式路由导航...

解决程序因缺少xinput1_3.dll无法运行的有效方法,有效修复丢失xinput1_3.dll

如果你的电脑在运行某些应用程序或游戏时提示“xinput1_3.dll丢失”或“找不到xinput1_3.dll”的错误消息&#xff0c;那么很可能是因为你的系统中缺少这个重要的DLL文件而导致的问题。那么电脑出现xinput1_3.dll丢失的问题时有哪些方法进行修复呢&#xff1f; 如何确定电脑是否…...

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地球观测计…...

看电动缸是如何提高农机的自动化水平

电动缸作为一种将电动机的旋转运动转变为推杆的直线往复运动的电力驱动装置&#xff0c;在提升农机自动化水平方面发挥了重要作用。以下详细分析电动缸如何提高农机的自动化水平&#xff1a; 一、电动缸的工作原理与优势 电动缸的工作原理是以电力作为直接动力源&#xff0c;采…...

C++ 并发专题 - 条件变量的使用

一&#xff1a;概述&#xff1a; 在 C 中&#xff0c;条件变量&#xff08;std::condition_variable&#xff09;是一种用于线程间同步的机制&#xff0c;主要用于在多线程环境中让一个线程等待某个条件满足后再继续执行。条件变量通常配合互斥锁&#xff08;std::mutex&#…...

《Essential C++》学习笔记

《Essential C》这本书&#xff0c;是适合从C选手快速过度到C选手的 一本书&#xff0c;下面是个人记录 第一章&#xff1a;基础语法 第一章主要就是C语言基础&#xff0c;这里类似于表达式 数组 条件语句 循环语句&#xff0c;就不多概述了。 :::info vector&#xff1a;可动…...

揭秘!微服务架构下,Apollo 配置中心凭啥扮演关键角色?

在当今的微服务架构蓬勃发展的时代&#xff0c;配置中心扮演着极为关键的角色&#xff0c;其重要性不言而喻。今天&#xff0c;我们就以 Apollo 为例&#xff0c;聊聊配置中心在微服务架构中的重要意义。 一、微服务架构下的配置管理挑战 随着微服务架构的广泛应用&#xff0…...

每日OJ题_牛客_春游_贪心+数学_C++_Java

目录 牛客_春游_贪心数学 题目解析 C代码 Java代码 牛客_春游_贪心数学 春游 描述&#xff1a; 盼望着&#xff0c;盼望着&#xff0c;东风来了&#xff0c;春天脚步近了。 值此大好春光&#xff0c;老师组织了同学们出去划船&#xff0c;划船项目收费如下&#xff1a;…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...