MySQL大批量删除时导致插入失败
问题描述
大批量数据删除时,导致插入失败
delete
from tableName
where create_time < timePoint使用此语句删除一千四百余万条数据,耗时两个多小时
DeleteFromTime:2022-03-09 01:00:00.004
DeleteToTime:2022-03-09 03:09:54.757
AllDeletedRows:14368263
TimeCost:7794753ms同时引发了插入异常:
Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
原因分析:
删除时,因为是范围删除且数据量大,未走索引,从而锁住全表,造成后续插入失败
解决方案:
更改删除逻辑,在删除时,添加limit 10000限制,代码里循环删除:
delete
from tableName
where create_time < timePoint
limit 10000
有文章表明,如果数据量小于全表数据量的20%(也有说30%的),where子句如果是范围条件,也会走索引
经实践表明:范围查询结果集为700w数据量的的SQL,limit在50w及以下时能够走索引,limit500w索引失效
同时是否走索引也受总数据量的影响:如果表的总数据量较小,哪怕limit超过了总数据量的50%,也会走索引
在线修改缓存大小(InnioDB):set global innodb_buffer_pool_size = 10737418240(10G,服务器内存16G)
innodb_buffer_pool_instances提示只读,无法修改。查阅他人文字发现该参数对性能影响不大,参考链接:http://blog.itpub.net/30135314/viewspace-2711910/
set global innodb_buffer_pool_size = 10737418240需要写入my.cnf以便于下次重启服务器自动设置
show variables like ‘innodb_buffer_pool%’;
show global status like ‘%innodb_buffer_pool_pages%’;
这两句SQL可以查看buffer pool一些信息
MyISAM索引缓存可参阅链接
https://www.docs4dev.com/docs/zh/mysql/5.7/reference/cache-index.html
MySQL大批量删除时导致插入失败相关推荐
- 解决mysql级联删除时不会启动delete触发器
解决mysql级联删除时不会启动delete触发器 目前mysql 5.* 版本在级联删除时不会执行delete触发器,当外键级联删除后没有启动触发器可能会产生一些垃圾数据,这些垃圾数据可能因为某些原 ...
- SQL驱动限制,导致插入失败
insert into TB_IF_ORDERS (DC_CD,JOB_DT,SEQ_NO,ORDER_KEY,ORDER_ID,ORDER_LINE_NUM,COMPANY_CD,CUST_CD,S ...
- 关于MySQL卸载不干净导致重新安装失败的一次记录
1.控制面板卸载mysql服务 2.C盘有3个地方要删除整个MySQL目录,Program Files|Program Files (x86)|ProgramData,其中ProgramData有可能 ...
- mybatis-plus插入数据失败,原因是使用数据库关键字作为列名导致插入失败
报错相关信息: org.springframework.jdbc.BadSqlGrammarException: ### Error updating database. Cause: com.mys ...
- mysql批量更新,批量插入之replace语句/insert into... on duplicate key update语句
mysql批量更新/插入数据有以下方法,使用这些方法批量插入数据/更新数据的时候就不用在代码层次增加判断数据是否已存在的逻辑了. 1:replace语句 2: insert into... on du ...
- Mysql批量删除大量数据
一.Mysql批量删除大量数据 方案1 假设有一个表(syslogs)有1000万条记录,需要在业务不停止的情况下删除其中statusid=1的所有记录,差不多有600万条, 直接执行 DELETE ...
- mysql插入长字符串_求助! php mysql insert 长字符串不能插入问题.
语句是这样的: $sql = "INSERT INTO `{$table->column_list_page}` set nID='{$_REQUEST['NodeID']}',Tit ...
- mysql群删除记录查询_mysql那些招:执行大批量删除、查询和索引等操作
类型:数据库类大小:1.7M语言:英文 评分:6.6 标签: 立即下载 mysql执行大批量删除 执行大批量删除的时候注意要使用上limit 因为如果不用limit,删除大量数据很有可能造成死锁 如果 ...
- mysql如何批量删除索引_mysql执行大批量删除、查询和索引等操作教程
mysql执行大批量删除 执行大批量删除的时候注意要使用上limit 因为如果不用limit,删除大量数据很有可能造成死锁 如果delete的where语句不在索引上,可以先找主键,然后根据主键删除数 ...
最新文章
- Cookie与Session的区别
- RHEL5.3下搭建SSH
- linux 常用快捷键
- 14个你可能不知道的JavaScript调试技巧
- git工作区和缓存区概念理解
- 加载java ie停止工作_打开网页,IE浏览器提示Internet Explorer 已停止工作什么原因?怎么解决?...
- 如果在2008年用10万元投资腾讯,现在可以实现财务自由吗?
- 47 Majority Element II
- Java中取某一个范围的随机数
- Atitit java项目常用类库表 目录 1. Ati总的常用库	1 1.1. 表达式,语言解析类库	1 1.2. 字符串模板解析库velocity freemark	1 1.3. rest库
- iconfont-阿里巴巴矢量图标库的使用方法
- Python学习资料篇
- 施密特触发器——用于正弦波转方波、脉冲波整形
- web服务器硬件软件配置选择
- MAtlab wavefront,这是张小飞的阵列信号的全部MATLAB代码 传统的高分辨波达方向(DOA)估计算法中 - 下载 - 搜珍网...
- 世界杯“诈骗杯”?小心这些就对了
- LoadRunner 回放出错
- PC - Chrome 浏览器如何开启无痕模式?
- VisualStdio2013旗舰版激活码-注册码.
- 华硕B250M+I5-7500黑苹果EFI引导文件