MySQL 删除大量数据

  • 效果
  • 操作
    • 数据量太大 无法count
    • 存储过程 分批 批量删除
    • 为什么使用存储过程
      • 分析
      • 测试数据
    • 优化空间
      • 注意
      • 参考:

效果

操作

数据量太大 无法count

select
table_schema as '数据库',
table_name as '表名',
table_rows as '记录数',
truncate(data_length/1024/1024, 2) as '数据容量(MB)',
truncate(index_length/1024/1024, 2) as '索引容量(MB)'
from information_schema.tables
where table_schema='new_message_db'
order by data_length desc, index_length desc;

存储过程 分批 批量删除

CREATE DEFINER=`dbmanager`@`%` PROCEDURE `DelMessageData`()
BEGIN#Routine body goes here...DECLARE COILNO VARCHAR(255);DECLARE COILNO_CURSOR_COUNT INT DEFAULT 1;-- 先查出删除条件 in 里面的值(我的是DELIVERYCOILNO),放到游标里DECLARE COILNO_CURSOR CURSOR FORSELECT sMessageId FROM new_message_db.t_message WHERE _iDeleteTime > 0 AND _iDeleteTime < UNIX_TIMESTAMP( '20220301' ) limit 100000;-- 设置循环的次数(游标的大小)DECLARE EXIT HANDLER FOR NOT FOUND SET COILNO_CURSOR_COUNT = 0;OPEN COILNO_CURSOR;-- 循环游标WHILE COILNO_CURSOR_COUNT <> 0 DOFETCH COILNO_CURSOR INTO COILNO;-- INSERT INTO qualitydb.test(val2) VALUES(COILNO);DELETE FROM new_message_db.t_message WHERE sMessageId = COILNO;END WHILE;CLOSE COILNO_CURSOR;
END

为什么使用存储过程

分析

  • 在不切换表的前提下,直接delete 大量数据 ,会产生大量的行锁。例如直接删除一千万数据,会锁一千万条数据,如果中途取消操作,MySQL会回滚,回滚会耗费几倍于删除的时间。所以绝对不能直接删除。
  • 使用存储过程,先将要删除的数据主键查询出,存放于游标中,然后在循环中 使用Delete语句 以主键为条件,逐行删除。这样不会产生大量的行锁,及长时间未提交的事务。 在业务请求低峰可以进行百万级数据的删除。

测试数据

使用存储过程批量删除数据 (1核1G的阿里云RDS)
-- 10万条 5min
-- 100万条 50min
-- 1000万条 8.3H (推测值)
-- 1000条/s

优化空间

optimize table new_message_db.t_message

注意

  • OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。
  • 使用 table 复制方法重建 table
  • 执行过程会锁表

OPTIMIZE TABLE将online DDL用于常规 table 和已分区的InnoDBtable,这减少了并发 DML操作的停机时间。由OPTIMIZE TABLE触发并由ALTER TABLE … FORCE进行隐藏的 table 重建已就位。排他table 锁定仅在操作的准备阶段和提交阶段短暂进行。在准备阶段,将更新元数据并创建一个中间 table。在提交阶段,将提交 table元数据更改。

  • 区分存储引擎

对于myisam可以直接使用 optimize table table.name, 当是InnoDB引擎时,会报“Table does not support optimize, doing recreate + analyze instead”,一般情况下,由myisam转成innodb,会用alter table table.name engine='innodb’进行转换,优化也可以用这个。所以当是InnoDB引擎时我们就用alter table table.name engine='innodb’来代替optimize做优化就可以。

参考:

optimize table

MySQL 删除大量数据相关推荐

  1. MySql删除重复数据(只保留一条)

    MySql删除重复数据 1. 问题引入 前一段遇到MySql数据重复的问题.由于重复向同一张表导入同一批数据,导致前台展示的数据重复,唯一方便快捷的方法莫过于利用delete操作删除重复数据(已经封板 ...

  2. Mysql 删除重复数据保留一条有效数据

    ============================== ©Copyright 蕃薯耀 2023-01-31 蕃薯耀的博客_CSDN博客-蕃薯耀分享,java,js领域博主 一.Mysql 删除重 ...

  3. MySQL删除重复数据只保留最新的一条

    MySQL删除重复数据并保留最新的一条,网上有些博客写的有问题,因为他们只考虑到或者说他们的重复数据最多只有两条,当重复数据大于2时,就会出现问题. 案例描述: 按天删除表中重复数据只保留最新的一条( ...

  4. MySQL 删除表数据,重置自增 id 为 0 的两个方式

    MySQL 删除表数据,重置自增 id 为 0 的两个方式: 1.truncate table table_name; truncate table `user`; 2.delete 配合 alter ...

  5. oracle 查重复_日常答疑|MySQL删除重复数据踩过得坑

    问题 群友提问:MySQL这样删除重复数据为啥不成功呢? 严小样儿:安排! 咋一看,大家都说where子句里面应该使用极值函数,加个max就对了,这么简单! # 大家想象中这样写是对的,其实仍然是错的 ...

  6. MySql 删除重复数据

    为什么80%的码农都做不了架构师?>>>    假设表结构 CREATE TABLE `users` (                                        ...

  7. mysql 删除重复数据_MySQL查找和删除重复数据

    如何从MySQL中删除重复数据,只保留一条呢? 假设有如下一个数据表: mysql > SELECT * FROM users; +----+--------+ | id | name | +- ...

  8. mysql 删除重复数据_日常答疑|MySQL删除重复数据踩过得坑

    问题 群友提问:MySQL这样删除重复数据为啥不成功呢? 严小样儿:安排! 咋一看,大家都说where子句里面应该使用极值函数,加个max就对了,这么简单! # 大家想象中这样写是对的,其实仍然是错的 ...

  9. MySQL删除大量数据脚本

    给上一篇文章配套个脚本方便大家实现删除大量数据. 废话不多说,直接上脚本: #!/bin/bash mx1=`ps aux | grep "deletedata.sh" | gre ...

最新文章

  1. 二叉树的5种遍历方式
  2. 「版权流氓」终结者:6天时间,堆出687亿段旋律
  3. win10 vEthernet
  4. 如何保留linux中yum安装后的rpm软件包
  5. 暑假集训考试反思+其它乱写
  6. @ResponseBody//该注解会将返回值转为json格式并放到响应体中返回到前台
  7. 【Elasticsearch】Elasticsearch Span Query跨度查询
  8. 无需搭建和训练模型,87行代码搞定文章摘要生成
  9. Java web 实现视频在线播放的常用几种方法
  10. conficker病毒
  11. 下载 MIUI任意型号卡刷包/线刷包
  12. 如何看Dlink DWA-125 无线网卡使用的芯片
  13. 【MongoDB】索引属性 之 唯一索引
  14. android qq 邮箱格式,QQ邮箱格式怎么写
  15. 全能扫描王(一款识别率超高的OCR识别APP)
  16. JAVA高级工程师知识树
  17. 8051蜂鸣器程序c语言,求51单片机蜂鸣器程序
  18. 从React专利事件看开源软件许可
  19. 数字练习_为什么要练习数字简约
  20. tf.range详解

热门文章

  1. Notepad++ 7.6版本 安装hexeditor最新详细版本(小白版)
  2. 计算机毕业设计Java的健身房管理系统(源码+系统+mysql数据库+lw文档)
  3. 俄罗斯方块(Tetris)
  4. 如何使用 Alink 进行中文情感分析?
  5. DataNucleus之JDO操作示例
  6. 嵌入式linux,增加串口登陆密码
  7. 猫掉进山洞C语言随机数,《小猫出生在秘密山洞》读书心得最新范文五篇
  8. 在vue.js中实现a标签href tel的打电话功能
  9. 力扣:探索初级算法——数组篇——有效的数独
  10. linux非yum安装svn,linux安装svn(yum安装)