Mysql删除语句执行时间慢如何优化

由于业务需求需同步处理订单数据,Mysql语句如下:

DELETE FROM `order` WHERE `order_id` IN ('123', '456') AND status IN ('A0003', 'A0005');

order_id的范围会比较大,大概几个到几十个不等。

目前观测到慢日志,该删除操作会产生很多慢查询,平均每秒1-2秒,该表目前有500W。
索引情况:

Mysql删除语句执行时间慢如何优化

Mysql删除语句执行时间慢如何优化

请问针对该SQL有什么样的优化建议

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 8

「平均每秒 1-2 秒」啥意思?每次查询 1 - 2 秒?

  • status字段也加索引试试
  • 123 456 这些字符串改为数字
  • 试试这样,将IN改为JOIN关联:
    DELETE `order` FROM `order`
    INNER JOIN (
      SELECT 123 AS `id` UNION SELECT 456 AS `id`
    ) AS `tmp_ids` ON `order`.`id` = `tmp_ids`.`id`
    WHERE status IN ('A0003', 'A0005')
2年前 评论

@LiamHao 是的,每次执行delete1-2秒左右。加个order_id,status的联合索引?

2年前 评论
LiamHao 2年前

因为你查询范围过大锁表导致的吧,不要直接删,可以先查询出来,然后用where in id 来删除。

2年前 评论
aeo_ (楼主) 2年前
Adachi (作者) 2年前
aeo_ (楼主) 2年前
Adachi (作者) 2年前
Adachi (作者) 2年前
aeo_ (楼主) 2年前
Adachi (作者) 2年前
Adachi (作者) 2年前
aeo_ (楼主) 2年前
Adachi (作者) 2年前
Adachi (作者) 2年前
sreio

建议先查,存在再进行删除

2年前 评论
sreio (作者) 2年前
aeo_ (楼主) 2年前
aeo_ (楼主) 2年前
颠倒的玉石

orderid和status都命中试试看???

2年前 评论

可以检查该表增删操作是否很多,是的话可能会有碎片,可以使用 optimize table 去优化表

2年前 评论
aeo_ (楼主) 2年前

@muggle 阿里云给出的碎片率2%

file

2年前 评论
muggle 2年前
aeo_ (作者) (楼主) 2年前

建议加范围删除。如果慢是因为数据太多的话。就只能分多次删除啦。比如分十次删除。这样就好啦

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!