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

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

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

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

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

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

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

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

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 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')
3周前 评论

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

3周前 评论
LiamHao 3周前

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

3周前 评论
aeo_ (楼主) 3周前
Adachi (作者) 3周前
aeo_ (楼主) 3周前
Adachi (作者) 3周前
Adachi (作者) 3周前
aeo_ (楼主) 3周前
Adachi (作者) 3周前
Adachi (作者) 3周前
aeo_ (楼主) 3周前
Adachi (作者) 3周前
Adachi (作者) 3周前

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

3周前 评论
ware (作者) 3周前
aeo_ (楼主) 3周前
aeo_ (楼主) 3周前

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

3周前 评论

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

3周前 评论
aeo_ (楼主) 3周前

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

file

3周前 评论
muggle 3周前
aeo_ (作者) (楼主) 3周前

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

3周前 评论

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