MySQL 删除大量数据
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 删除大量数据相关推荐
- MySql删除重复数据(只保留一条)
MySql删除重复数据 1. 问题引入 前一段遇到MySql数据重复的问题.由于重复向同一张表导入同一批数据,导致前台展示的数据重复,唯一方便快捷的方法莫过于利用delete操作删除重复数据(已经封板 ...
- Mysql 删除重复数据保留一条有效数据
============================== ©Copyright 蕃薯耀 2023-01-31 蕃薯耀的博客_CSDN博客-蕃薯耀分享,java,js领域博主 一.Mysql 删除重 ...
- MySQL删除重复数据只保留最新的一条
MySQL删除重复数据并保留最新的一条,网上有些博客写的有问题,因为他们只考虑到或者说他们的重复数据最多只有两条,当重复数据大于2时,就会出现问题. 案例描述: 按天删除表中重复数据只保留最新的一条( ...
- MySQL 删除表数据,重置自增 id 为 0 的两个方式
MySQL 删除表数据,重置自增 id 为 0 的两个方式: 1.truncate table table_name; truncate table `user`; 2.delete 配合 alter ...
- oracle 查重复_日常答疑|MySQL删除重复数据踩过得坑
问题 群友提问:MySQL这样删除重复数据为啥不成功呢? 严小样儿:安排! 咋一看,大家都说where子句里面应该使用极值函数,加个max就对了,这么简单! # 大家想象中这样写是对的,其实仍然是错的 ...
- MySql 删除重复数据
为什么80%的码农都做不了架构师?>>> 假设表结构 CREATE TABLE `users` ( ...
- mysql 删除重复数据_MySQL查找和删除重复数据
如何从MySQL中删除重复数据,只保留一条呢? 假设有如下一个数据表: mysql > SELECT * FROM users; +----+--------+ | id | name | +- ...
- mysql 删除重复数据_日常答疑|MySQL删除重复数据踩过得坑
问题 群友提问:MySQL这样删除重复数据为啥不成功呢? 严小样儿:安排! 咋一看,大家都说where子句里面应该使用极值函数,加个max就对了,这么简单! # 大家想象中这样写是对的,其实仍然是错的 ...
- MySQL删除大量数据脚本
给上一篇文章配套个脚本方便大家实现删除大量数据. 废话不多说,直接上脚本: #!/bin/bash mx1=`ps aux | grep "deletedata.sh" | gre ...
最新文章
- 二叉树的5种遍历方式
- 「版权流氓」终结者:6天时间,堆出687亿段旋律
- win10 vEthernet
- 如何保留linux中yum安装后的rpm软件包
- 暑假集训考试反思+其它乱写
- @ResponseBody//该注解会将返回值转为json格式并放到响应体中返回到前台
- 【Elasticsearch】Elasticsearch Span Query跨度查询
- 无需搭建和训练模型,87行代码搞定文章摘要生成
- Java web 实现视频在线播放的常用几种方法
- conficker病毒
- 下载 MIUI任意型号卡刷包/线刷包
- 如何看Dlink DWA-125 无线网卡使用的芯片
- 【MongoDB】索引属性 之 唯一索引
- android qq 邮箱格式,QQ邮箱格式怎么写
- 全能扫描王(一款识别率超高的OCR识别APP)
- JAVA高级工程师知识树
- 8051蜂鸣器程序c语言,求51单片机蜂鸣器程序
- 从React专利事件看开源软件许可
- 数字练习_为什么要练习数字简约
- tf.range详解
热门文章
- Notepad++ 7.6版本 安装hexeditor最新详细版本(小白版)
- 计算机毕业设计Java的健身房管理系统(源码+系统+mysql数据库+lw文档)
- 俄罗斯方块(Tetris)
- 如何使用 Alink 进行中文情感分析?
- DataNucleus之JDO操作示例
- 嵌入式linux,增加串口登陆密码
- 猫掉进山洞C语言随机数,《小猫出生在秘密山洞》读书心得最新范文五篇
- 在vue.js中实现a标签href tel的打电话功能
- 力扣:探索初级算法——数组篇——有效的数独
- linux非yum安装svn,linux安装svn(yum安装)