ToB企服应用市场:ToB评测及商务社交产业平台

标题: MySQL 批量删除海量数据的几种方法 [打印本页]

作者: 笑看天下无敌手    时间: 2024-11-25 23:43
标题: MySQL 批量删除海量数据的几种方法
目次
一、问题分析
二、批量删除海量数据的几种方法
方法 1:利用 LIMIT 分批删除
方法 2:通过主键范围分批删除
方法 3:通过自定义批量删除存储过程
方法 4:创建暂时表替换旧表
三、性能优化发起
总结

        在数据库的日常维护中,我们经常遇到必要删除大量数据的场景。例如,删除过期日记、清算汗青数据等。但如果一次性删除大量数据,大概会导致锁表、事件日记暴增、影响数据库性能等问题。本文将先容几种高效批量删除 MySQL 海量数据的方法。
一、问题分析

一次性删除大量数据的重要问题在于:
为制止这些问题,可以考虑分批删除等策略来淘汰对数据库的压力。
二、批量删除海量数据的几种方法

方法 1:利用 LIMIT 分批删除

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

假设我们要删除 logs 表中创建时间在某个日期之前的所有数据:
  1. -- 设置每批删除的行数
  2. SET @BATCH_SIZE = 1000;
  3. -- 分批删除符合条件的数据
  4. DELETE FROM logs
  5. WHERE create_time < '2023-01-01'
  6. LIMIT @BATCH_SIZE;
复制代码
可以将上述语句放入存储过程或在应用层循环调用。每次删除 BATCH_SIZE 行数据,淘汰锁表时间和日记生成量。
优点:


缺点:


注意:


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

如果要删除的数据在主键上是一连的(如自增 ID),可以按主键范围分批删除。如许能够制止 LIMIT 的偏移开销,提高删除效率。
示例 SQL:

假设 logs 表的主键是 id:
  1. -- 设置每批删除的范围
  2. SET @start_id = 0;
  3. SET @end_id = 1000;
  4. WHILE (@start_id < (SELECT MAX(id) FROM logs WHERE create_time < '2023-01-01')) DO
  5.     DELETE FROM logs
  6.     WHERE id BETWEEN @start_id AND @end_id
  7.     AND create_time < '2023-01-01';
  8.     -- 更新删除范围
  9.     SET @start_id = @end_id + 1;
  10.     SET @end_id = @end_id + 1000;
  11. END WHILE;
复制代码
优点:


缺点:


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

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

  1. DELIMITER $$
  2. CREATE PROCEDURE batch_delete_logs()
  3. BEGIN
  4.     DECLARE done INT DEFAULT FALSE;
  5.     DECLARE batch_size INT DEFAULT 1000;
  6.     WHILE NOT done DO
  7.         DELETE FROM logs
  8.         WHERE create_time < '2023-01-01'
  9.         LIMIT batch_size;
  10.         -- 检查是否还有剩余数据
  11.         IF ROW_COUNT() < batch_size THEN
  12.             SET done = TRUE;
  13.         END IF;
  14.     END WHILE;
  15. END $$
  16. DELIMITER ;
复制代码
执行存储过程:
  1. CALL batch_delete_logs();
复制代码
优点:


缺点:


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

在某些环境下,删除大表中的大量数据可以通过创建新表的方法完成。即先将必要保留的数据转移到新表,再删除旧表。这种方法可以淘汰锁表时间和日记开销。
步骤:

示例 SQL:

  1. -- 创建新表
  2. CREATE TABLE logs_new LIKE logs;
  3. -- 插入需要保留的数据
  4. INSERT INTO logs_new
  5. SELECT * FROM logs WHERE create_time >= '2023-01-01';
  6. -- 删除旧表并重命名新表
  7. DROP TABLE logs;
  8. RENAME TABLE logs_new TO logs;
复制代码
优点:


缺点:


三、性能优化发起

总结

方法适用场景优点缺点LIMIT 分批删除必要简单分批删除逻辑简单,淘汰锁表时间需循环操纵主键范围分批删除有一连主键的表高效,无偏移开销需手动指定范围自定义批量删除存储过程小批量删除自动化操纵必要数据库支持存储过程暂时表替换删除数据量非常大制止锁表,淘汰日记开销必要额外磁盘空间 根据不同的业务场景和需求,选择符合的批量删除方式可以提高 MySQL 的删除效率,淘汰对数据库的影响。渴望本文对各人在 MySQL 的数据清算和维护上有所资助!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4