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

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

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

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

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

(1秒左右)的速度删除770多万条数据,单张表总数据量在4600万上下,优化过程的方案层层递进,详细记录如下: 批量删除(每次限定一定数量),然后循环删除直到全部数据删除完毕;同时key_buffer_size...直接的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.6K21

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

1; rows examined 为 1,没有扫描大量数据。...3.1 聊一下 MVCC MySQL InnoDB 支持 MVCC 多版本,可以在普通的 SELECT 时不加锁。利用多版本读取指定版本的行记录,降低加锁的次数,能极大提高数据库的并发读写能力。...当记录被执行删除的时候,MySQL 只是将记录标记为已删除,同时更新 DATA_TRX_ID 为自己删除会话的事务 ID,并没有将记录真正删除。...由于被删除的记录有 2000 万,Innodb 需要扫描 2000 万的记录,才能找到符合条件的第一条记录,然后返回到 MySQL 的 Server 层。...四、总结 当新的会话执行 SQL 的时候,如果扫描区间范围内有大量被标记为删除的记录,会导致 SQL 执行效率变低,通过二级索引去查询也是类似的。

65020

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

1; rows examined 为 1,没有扫描大量数据。...3.1 聊一下 MVCC MySQL InnoDB 支持 MVCC 多版本,可以在普通的 SELECT 时不加锁。利用多版本读取指定版本的行记录,降低加锁的次数,能极大提高数据库的并发读写能力。...当记录被执行删除的时候,MySQL 只是将记录标记为已删除,同时更新 DATA_TRX_ID 为自己删除会话的事务 ID,并没有将记录真正删除。...由于被删除的记录有 2000 万,Innodb 需要扫描 2000 万的记录,才能找到符合条件的第一条记录,然后返回到 MySQL 的 Server 层。...四、总结 当新的会话执行 SQL 的时候,如果扫描区间范围内有大量被标记为删除的记录,会导致 SQL 执行效率变低,通过二级索引去查询也是类似的。

1.2K30

mysql批量插入大量数据「建议收藏」

mysql批量插入大量数据 时间:2020年11月25日 今天遇到了一个批量插入大量数据任务,然后出于小白本能,直接for-each循环插入不就好了,于是手上开始噼里啪啦一顿操作,写好了从读取excel...1w条数据插入了11s,比上面不知道快了多少,可是这样插入是有一个弊端的,就是数据量再大一点的话,会报错的,我改成10w去跑一下给你们看一下效果 ### Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException...三、method-3 第三种,通过原生的jdbc连接设置,然后打开批量处理的方式去处理数据 MySQL的JDBC连接的url中要加rewriteBatchedStatements参数,并保证5.1.13...MySQL JDBC驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,批量插入实际上是单条插入,直接造成较低的性能。...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除

3.6K10

MySQL批量更新大量数据方法分享

最近需要批量更新大量数据,习惯了写sql,所以还是用sql来实现,update A set a='123' where code in (select code from B);,以前都是这样处理,不过因为表...B是一个大表,数据量特别多,执行特别耗时,所以后面想到通过查询大量数据,然后再放在in里面,不过因为之前用惯了oracle,知道in只能支持1000条数据,不知道mysql里竟然没有这个限制,不知道是否可以通过...然后这些数据可以查出来,不过都是没有加上双引号的,所以可以在notepad++里进行处理 在大量数据前面,可以按Alt健,然后再加上,不过觉得数据量太多,还是麻烦,所以可以通过正则表达式的方法进行批量替换...,按Ctrl+H,查找模式选择正则表达式,查找目标写为^,替换为",然后点全部替换 替换后面的,同样,查找目标写为$,替换为",,点全部替换 ok,数据就可以很快处理好了,还要借助Excel的筛选功能...,数据处理好之后,就可以将数据复制到sql的in里,批量更新,数据相对快很多

3.7K10

mysql大量数据分页查询优化-延迟关联

所有的php初学者都应该知道,mysql的分页语句写法如下: select * from a limit (page-1)*page_size,page_size 而当这语句分页到一定程度时,例如1000...页,每页20条 select * from a limit 19980,20 会发现分页之后查询的会越来越慢 原因是因为limit a,b 的取数据方式是,先取出a+b条数据,再把a条筛选掉,剩b条...,相当于一次性要取a+b条的数据,而a条其实是无用的 解决方案如下 一:php代码解决 例如我们先查询出第一页的数据: select * from a limit 20 保留最后一个的id,当需要取第2...,不做优化,当到101页时采用该优化方案,并且不让用户从101页进行页面跳转到1xx页 二:mysql解决 SELECT *         FROM a         inner join(          ...mysql索引覆盖查询,0.089秒

2.5K20

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

墨墨导读:本文记录一次大量删除导致MySQL慢查的分析,大家有没有遇到过这种问题? 一、背景 监控上收到了大量慢查的告警,业务也反馈查询很慢,随即打开电脑确认慢查的原因。...二、现象描述 慢查的表名都是 sbtest1,没有其他的表; 大部分的慢查都是查表最新的数据,例如 select * from sbtest1 limit 1; rows examined 为 1,没有扫描大量数据...当记录被执行删除的时候,MySQL 只是将记录标记为已删除,同时更新 DATA_TRX_ID 为自己删除会话的事务 ID,并没有将记录真正删除。...由于被删除的记录有 2000 万,Innodb 需要扫描 2000 万的记录,才能找到符合条件的第一条记录,然后返回到 MySQL 的 Server 层。...四、总结 ---- 当新的会话执行 SQL 的时候,如果扫描区间范围内有大量被标记为删除的记录,会导致 SQL 执行效率变低,通过二级索引去查询也是类似的。

79020

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

1; rows examined 为 1,没有扫描大量数据。...3.1 聊一下 MVCC MySQL InnoDB 支持 MVCC 多版本,可以在普通的 SELECT 时不加锁。利用多版本读取指定版本的行记录,降低加锁的次数,能极大提高数据库的并发读写能力。...当记录被执行删除的时候,MySQL 只是将记录标记为已删除,同时更新 DATA_TRX_ID 为自己删除会话的事务 ID,并没有将记录真正删除。...由于被删除的记录有 2000 万,Innodb 需要扫描 2000 万的记录,才能找到符合条件的第一条记录,然后返回到 MySQL 的 Server 层。...四、总结 当新的会话执行 SQL 的时候,如果扫描区间范围内有大量被标记为删除的记录,会导致 SQL 执行效率变低,通过二级索引去查询也是类似的。

70460
领券