mysql delete 操作速度慢!

2021-06-16 10:26:31 +08:00
 aeo13

1 、由于业务需要,需要对接第三方的数据,如某个用户访问时会执行同步接口,之后按顺序对数据执行删除、修改和新增。目前增改都没有问题,但是删除会很慢,导致每分钟都会有好几条慢日志生成。

2 、该表数据目前是三百多 W 。

3 、目前的删除 sql 是 DELETE FROM order WHERE order_id IN () AND status IN (),order_id 有几个到几十个不等,status 有几个。

阿里云 RDS 的慢日志(截取某一分钟): https://imgur.com/S5N6w2v EXPLAIN 结果: https://imgur.com/dhCSC3a

4 、所作尝试 1 )改用 select 所有主键 id 再 in 删除主键 id,发现执行时间更长 2 )改用 delete where userid = 用户 id,发现执行时间更长 3 )改用循环删除操作,CPU 顶不住

6679 次点击
所在节点    MySQL
37 条回复
beitayongguo
2021-06-16 16:47:14 +08:00
用 in 为啥会索引失效?

从 explain 看没啥问题 让 dba 帮忙抓包看看呢
vindac
2021-06-16 16:48:01 +08:00
是不是在用多线程操作
myd
2021-06-16 16:53:35 +08:00
创建联合索引 order_id, status
aeo13
2021-06-16 17:01:56 +08:00
@myd 应该不是索引问题啊,查询后用 where 主键 in 删除都巨慢。。
aeo13
2021-06-16 17:02:09 +08:00
@vindac 没有哦
billccn
2021-06-16 17:04:56 +08:00
有其他表外键到这个表吗?如果其他表相应的列不做索引,删除的时候只有查全表才能确定外键是不是还有效。
aeo13
2021-06-16 17:14:38 +08:00
@billccn 没有外键
offswitch
2021-06-16 17:19:47 +08:00
@sunnyday123 有 in 索引就失效?这是哪门子的说法? 4.0 以下才有这种情况。从上面抛出的执行计划上看是 range,走了 orderid,用了主键。
offswitch
2021-06-16 17:27:35 +08:00
阿里云的 RDS,是不是配置比较低呢?事务的问题,用定时任务一条条删除不行吗?
rockyliang
2021-06-16 19:00:30 +08:00
感觉两个图片对不上,EXPLAIN 显示扫描行数是 1,但 RDS 慢日志显示扫描行数几千行。建议用 SHOW PROFILE 命令查看语句的详细执行情况,看到底慢在哪里
huazaige
2021-06-16 19:46:06 +08:00
大致思路:
可以创建一个结构一样的新表,把需要留下的数据 copy 到这张新表里,然后直接删除老表,重命名新表
1 、基于老表创建一张新表:create table order_new like order;
2 、把需要留下的数据 插入到新表里:insert into order_new select * from order where id>1 and id<=3000000;
3 、删除老表:drop table order;
4 、重命名新表:alter table order_new rename to order;
littlewing
2021-06-16 23:09:54 +08:00
300 多万数据就算扫全表也不可能 6s 多,除非你单行数据特别大(几十 MB 这种)
rekulas
2021-06-16 23:10:53 +08:00
1 检查是否索引导致删除慢
2 分析下表试试
不清楚你 tps 多少
pgfourwell2020
2021-06-16 23:14:42 +08:00
@billccn 666
aeo13
2021-06-17 09:18:42 +08:00
@offswitch 是的,配置较低。请问事务的问题指的是?
Leigg
2021-06-17 09:41:56 +08:00
@aeo13 直接执行 delete from where order_id in order_ids...不可能慢吧,order_id 是有索引的,你创建组合索引来试试。
raaaaaar
2021-06-17 10:19:11 +08:00
额,不都是软删除么

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/783664

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX