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')) DO
    DELETE FROM logs
    WHERE id BETWEEN @start_id AND @end_id
    AND 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()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE batch_size INT DEFAULT 1000;

    WHILE NOT done DO
        DELETE FROM logs 
        WHERE create_time < '2023-01-01' 
        LIMIT batch_size;

        -- 检查是否还有剩余数据
        IF ROW_COUNT() < batch_size THEN
            SET 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 的数据清理和维护上有所帮助!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Jest进行JavaScript单元测试

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Jest进行JavaScript单元测试 引言 Jest 简介 安装 Jest 创建基本配置 编写测试用例 运行测试 快照测试 模拟函数 代码覆盖率…

白杨SEO:百度在降低个人备案类网站搜索关键词排名和流量?怎样应对?【参考】

很久没有写百度或者网站这块内容了&#xff0c;一是因为做百度网站朋友越来越少&#xff0c;不管是个人还是企业&#xff1b;二是百度上用户搜索与百度给到网站的流量都越来越少。 为什么想到今天又来写这个呢&#xff1f;因为上个月有个朋友来咨询我说网站百度排名全没了&…

Linux——Shell的运行原理和Linux文件权限

Shell的运行原理和Linux文件权限 文章目录 Shell的运行原理和Linux文件权限1. Shell的运行原理(1) Shell是什么(2) 为什么要有Shell(3) Shell的运行原理(4) 解析命令行 2. Linux文件(1) 文件属性(2) 文件类型(3) 文件权限(4) 文件权限的修改(1) chmod(2) chown(3) chgrp (5) um…

linux守护进程与后台进程的区别

守护进程与后台进程有以下区别&#xff1a; 1. 概念与定义 后台进程&#xff1a; 是指在操作系统后台运行的进程&#xff0c;它不与用户直接交互&#xff08;没有连接到用户的终端&#xff09;。用户在终端中启动一个程序并让其在后台运行&#xff08;如通过在命令后加“&…

Jmeter5.X性能测试

Jmeter5.X性能测试 文章目录 Jmeter5.X性能测试一、掌握Http基础协议1.1 浏览器的B/S架构和C/S架构1.2 HyperText Transfer Protocol 超文本传输协议1.3 超文本传输协议Http消息体拆分讲解1.4 HTTP的九种请求方法和响应码介绍1.5 Http请求头/响应头1.6 Http常见请求/响应头cont…

Spring 配置绑定原理分析

Spring 配置绑定原理分析 前言 Spring 应用中存在诸多配置&#xff0c;有的是系统配置&#xff0c;有的命令行启动参数配置&#xff0c;有的是yaml配置&#xff0c;有的是分布式配置中心配置&#xff0c;但对使用者而言总是可以通过ConfigurationProperties将它关联到一个Java…

爬虫下载网页文夹

爬虫下载网页pdf文件 import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin from urllib.parse import urljoin, unquote from tqdm import tqdm # 设置网页的URL base_url "http://119/download/dzz/pdf/"# 创建保存文件的…

数据结构-归并排序笔记

【数据结构】八大排序(超详解附动图源码)_数据结构排序-CSDN博客 看这个学思路 一 归并排序介绍: 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解&#xf…

编译器优化乌龙——记一次死循环不进入问题

记一次死循环不生效问题 看如下代码&#xff0c;本意是我们模拟一次死循环&#xff0c;然后会在中断处理函数中更改waiting的值&#xff0c;更改waiting的值后&#xff0c;跳出死循环。 int waiting 0; while(waiting0){}运行起来发现&#xff0c;程序根本就没有进入这个死循…

构建第一个ArkTs应用

1、新建第一个页面文件。在“Project”窗口&#xff0c;点击“entry > src > main > ets > pages”&#xff0c;打开“Index.ets”文件&#xff0c;进行页面的编写。 2、新建第二个页面文件。在“Project”窗口&#xff0c;打开“entry > src > main > e…

一文搞懂Linux kernel编译步骤

一、前言 什么是Linux的内核编译呢&#xff1f;简单来说&#xff0c;Linux内核编译是一个将内核源代码转换成可在特定的硬件架构上运行的二进制文件的过程。通过编译内核&#xff0c;我们可以根据自己的需求和兴趣对内核进行定制和优化&#xff0c;以满足特定的应用场景。下文…

IDEA构建JavaWeb项目,并通过Tomcat成功运行

目录 一、Tomcat简介 二、Tomcat安装步骤 1.选择分支下载 2.点击下载zip安装包 3.解压到没有中文、空格和特殊字符的目录下 4.双击bin目录下的startup.bat脚本启动Tomcat 5.浏览器访问Tomcat 6.关闭Tomcat服务器 三、Tomcat目录介绍 四、WEB项目的标准结构 五、WEB…

消息通知——公众号、小程序、短信对比

消息通知——公众号、小程序、短信对比 引言 在数字化时代&#xff0c;高效、准确的消息通知对于提升用户体验、增强用户粘性至关重要。本报告将深入分析三种常见的消息通知方式&#xff1a;微信公众号推送、微信小程序推送以及手机短信推送&#xff0c;从实现方式、优缺点及细…

三维测量与建模笔记 - 3.2 直接线性变换法标定DLT

DLT - Direct Linear Transform 上图中&#xff0c;透视成像对应的公式是共线方程&#xff0c;可以参考以下链接&#xff1a; https://zhuanlan.zhihu.com/p/101549821https://zhuanlan.zhihu.com/p/101549821 对于标定来说&#xff0c;需要找到。已知量是。 (u,v)是…

消息队列面试——打破沙锅问到底

消息队列的面试连环炮 前言 你用过消息队列么&#xff1f;说说你们项目里是怎么用消息队列的&#xff1f; 我们有一个订单系统&#xff0c;订单系统会每次下一个新订单的时候&#xff0c;就会发送一条消息到ActiveMQ里面去&#xff0c;后台有一个库存系统&#xff0c;负责获取…

【论文复现】KAN卷积:医学图像分割新前沿

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀知识图谱推理 1. 概述2. 核心创新点3. 模块介绍KANUNext模块 4. 本文主要结构5. 主要代码6. 数据集7. 结果展示8. 参考文献 前言&#xff1a;…

Oracle与SQL Server的语法区别

1&#xff09;日期和日期转换函数。 SQL: SELECT A.*, CASE WHEN NVL(PAA009,) OR PAA009 >Convert(Varchar(10), SYSDATE,120) THEN Y ELSE N END AS ActiveUser FROM POWPAA A WHERE PAA001admin or PAA002admin Oracle: SELECT A.*, CASE WHEN NVL(PAA009,) or PAA009&…

基于TRIZ理论的便携式光伏手机充电装置创新

随着智能手机功能的日益强大&#xff0c;电量消耗问题也日益凸显&#xff0c;尤其是在户外活动时&#xff0c;电量告急常常让人措手不及。面对这一挑战&#xff0c;基于TRIZ&#xff08;发明问题解决理论&#xff09;的创新思维&#xff0c;一款全新的便携式光伏手机充电装置应…

Vue3父传子

1. App.vue - 父组件 咱们先来看左边的 App.vue&#xff0c;它扮演的是“父亲”角色——你可以想象它是一位热心的老爸&#xff0c;手里拿着一条消息&#xff0c;正准备把这条消息送到“儿子”那里。 <script setup> // 这个 setup 就像一个神奇的开关&#xff0c;一开…

前端 算法 双指针

文章目录 三数之和移动零盛最多水的容器接雨水 三数之和 leetcode 三数之和 题目链接 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有…