首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

每日一面 - mysql 大表批量删除大量数据

问题参考自:https://www.zhihu.com/question/440066129/answer/1685329456 ,mysql中,一张表里有3亿数据,未分表,其中一个字段是企业类型,企业类型是一般企业和个体户...答案为个人原创 假设表的引擎是 Innodb, MySQL 5.7+ 删除一条记录,首先锁住这条记录,数据原有的被废弃,记录头发生变化,主要是打上了删除标记。...也就是原有的数据 deleted_flag 变成 1,代表数据被删除。但是数据没有被清空,在新一行数据大小小于这一行的时候,可能会占用这一行。这样其实就是存储碎片。...如果 delete 的数据是大量的数据,则会: 如果不加 limit 则会由于需要更新大量数据,从而索引失效变成全扫描导致锁表,同时由于修改大量的索引,产生大量的日志,导致这个更新会有很长时间,锁表锁很长时间...由于产生了大量 binlog 导致主从同步压力变大 由于标记删除产生了大量的存储碎片。由于 MySQL 是按页加载数据,这些存储碎片不仅大量增加了随机读取的次数,并且让页命中率降低,导致页交换增多。

1.9K20
您找到你想要的搜索结果了吗?
是的
没有找到

一次大量删除导致 MySQL 慢查的分析

文 | Harvey on 运维 一、背景 监控上收到了大量慢查的告警,业务也反馈查询很慢,随即打开电脑确认慢查的原因。...当 History list length 一直居高不下的时候,说明了有大量的 UNDO 没有被 purge。...当记录被执行删除的时候,MySQL 只是将记录标记为已删除,同时更新 DATA_TRX_ID 为自己删除会话的事务 ID,并没有将记录真正删除。...由于被删除的记录有 2000 万,Innodb 需要扫描 2000 万的记录,才能找到符合条件的第一条记录,然后返回到 MySQL 的 Server 层。...四、总结 当新的会话执行 SQL 的时候,如果扫描区间范围内有大量被标记为删除的记录,会导致 SQL 执行效率变低,通过二级索引去查询也是类似的。

1.2K30

一次大量删除导致 MySQL 慢查的分析

文 | Harvey on 运维 一、背景 监控上收到了大量慢查的告警,业务也反馈查询很慢,随即打开电脑确认慢查的原因。...当 History list length 一直居高不下的时候,说明了有大量的 UNDO 没有被 purge。...当记录被执行删除的时候,MySQL 只是将记录标记为已删除,同时更新 DATA_TRX_ID 为自己删除会话的事务 ID,并没有将记录真正删除。...由于被删除的记录有 2000 万,Innodb 需要扫描 2000 万的记录,才能找到符合条件的第一条记录,然后返回到 MySQL 的 Server 层。...四、总结 当新的会话执行 SQL 的时候,如果扫描区间范围内有大量被标记为删除的记录,会导致 SQL 执行效率变低,通过二级索引去查询也是类似的。

65620

MySQL 快速删除大量数据(千万级别)的几种实践方案——附源码

笔者最近工作中遇见一个性能瓶颈问题,MySQL表,每天大概新增776万条记录,存储周期为7天,超过7天的数据需要在新增记录前老化。...直接的delete后,mysql会合并索引块,涉及大量内存的拷贝移动;而OPTIMIZE TABLE直接重建索引,即直接把数据块情况,再重新搞一份(联想JVM垃圾回收算法)。...50,建议拷贝所需数据到临时表,然后删除原表,再重命名临时表为原表,附MySQL如下: INSERT INTO New SELECT * FROM Main WHERE...,而不会删除相应的数据 参考: 1)https://dev.mysql.com/doc/refman/5.7/en/alter-table-partition-operations.html 具体分区说明...2)http://mysql.rjweb.org/doc.php/deletebig#solutions  删除大数据的解决方案   本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明

6.8K21

详述一次大量删除导致MySQL慢查的过程

墨墨导读:本文记录一次大量删除导致MySQL慢查的分析,大家有没有遇到过这种问题? 一、背景 监控上收到了大量慢查的告警,业务也反馈查询很慢,随即打开电脑确认慢查的原因。...当 History list length 一直居高不下的时候,说明了有大量的 UNDO 没有被 purge。...当记录被执行删除的时候,MySQL 只是将记录标记为已删除,同时更新 DATA_TRX_ID 为自己删除会话的事务 ID,并没有将记录真正删除。...由于被删除的记录有 2000 万,Innodb 需要扫描 2000 万的记录,才能找到符合条件的第一条记录,然后返回到 MySQL 的 Server 层。...四、总结 ---- 当新的会话执行 SQL 的时候,如果扫描区间范围内有大量被标记为删除的记录,会导致 SQL 执行效率变低,通过二级索引去查询也是类似的。

79820

详述一次大量删除导致MySQL慢查的分析

一、背景 监控上收到了大量慢查的告警,业务也反馈查询很慢,随即打开电脑确认慢查的原因。...当 History list length 一直居高不下的时候,说明了有大量的 UNDO 没有被 purge。...当记录被执行删除的时候,MySQL 只是将记录标记为已删除,同时更新 DATA_TRX_ID 为自己删除会话的事务 ID,并没有将记录真正删除。...由于被删除的记录有 2000 万,Innodb 需要扫描 2000 万的记录,才能找到符合条件的第一条记录,然后返回到 MySQL 的 Server 层。...四、总结 当新的会话执行 SQL 的时候,如果扫描区间范围内有大量被标记为删除的记录,会导致 SQL 执行效率变低,通过二级索引去查询也是类似的。

70960

详述一次大量删除导致MySQL慢查的过程分析

当 History list length 一直居高不下的时候,说明了有大量的 UNDO 没有被 purge。...Innodb 在事务的某个时刻记录下 MySQL 所有的活跃事务列表,保存到 read view 里面。...当记录被执行删除的时候,MySQL 只是将记录标记为已删除,同时更新 DATA_TRX_ID 为自己删除会话的事务 ID,并没有将记录真正删除。...由于被删除的记录有 2000 万,Innodb 需要扫描 2000 万的记录,才能找到符合条件的第一条记录,然后返回到 MySQL 的 Server 层。...四、总结 ---- 当新的会话执行 SQL 的时候,如果扫描区间范围内有大量被标记为删除的记录,会导致 SQL 执行效率变低,通过二级索引去查询也是类似的。

63330

Oracle 删除大量表记录操作总结

删除表数据操作 清空所有表记录 TRUNCATE TABLE your_table_name; 或者批量删除满足条件的表记录 BEGIN LOOP DELETE FROM your_table_name...rownum <= 50000; EXIT WHEN SQL%ROWCOUNT = 0; COMMIT; END LOOP; END; 释放表空间 存放大数据量的表,其表空间占用也比较大,删除数据后并不会自动释放这些记录占用的表空间...WHERE segment_name='YOUR_TABLE_NAME'; --注意,表名必须大写 说明:sum(bytes)/(1024*1024) 数据统计单位由Byte转为GB --整理碎片,释放已删除记录占用的表空间...实际上,Oracle在REBUILD索引的过程中,并不会删除旧索引,直到新索引重建成功,这就是相对删除索引然后重建索引的一个好处:不会影响原有的SQL查询。...但也正由于此,用REBUILD方式建立索引需要相应表空间的空闲空间是删除重建方式的2倍。

1K20

mybatis 流式读取大量MySQL数据

本文链接:https://blog.csdn.net/qq_37933685/article/details/85100239 title: MyBatis 流式读取MySQL大量数据 date:...由于生成报表逻辑要从数据库读取大量数据并在内存中加工处理后再生成Excel返回给客户端。...文章目录 MyBatis 流式读取MySQL大量数据 背景: 开发环境: 实现步骤: 示例代码 心路历程 MyBatis 流式读取MySQL大量数据 背景: 最近公司提了个需求,说公司的旧系统的报表导出的时候...resultSetType="FORWARD_ONLY" fetchSize="-2147483648"> SELECT * FROM customer 个人原因:删除非关键部分代码...还有就是google出来的那些,要改框架配置的,我的确跟着改了,改了mysql连接参数,还有mybatis setting的配置。嗯,没用。

7K30
领券