【问题标题】:WHY DELETE takes much longer than SELECT (but same primary key based DELETE is fast)为什么 DELETE 比 SELECT 需要更长的时间(但基于相同主键的 DELETE 速度很快)
【发布时间】:2018-08-02 13:28:01
【问题描述】:

我想知道为什么我在 MySQL 5.5 myisam 表上的 DELETE 太慢了(我不得不取消它)

这条 SQL 不到一秒钟:

SELECT id FROM backup
WHERE id > 0 
      AND userId NOT IN 
      (SELECT id FROM user WHERE state > 0) 
ORDER BY id ASC LIMIT 100; 

这个相同的 DELETE 在 2 分钟后没有完成(我取消了它)

DELETE FROM backup
WHERE id > 0 
      AND userId NOT IN 
      (SELECT id FROM user WHERE state > 0) 
ORDER BY id ASC LIMIT 100; 

但是下面的 DELETE - 查询相同的行(刚刚被他们的主键直接选择) - 花了不到一秒钟的时间完成!

DELETE FROM backup WHERE id IN (12, 33, 34, [... 100 ids...])

编辑 我还尝试使用子子查询进行此修改 - 我在一分钟后取消了它...

DELETE FROM backup WHERE id IN (
    SELECT ID FROM (
        SELECT id FROM backup WHERE id > 0 
        AND userId NOT IN (SELECT id FROM user WHERE state > 0) 
        ORDER BY id ASC LIMIT 100
    ) a 
);

使用 INNER JOIN 不适用于 DELETE,因为我使用 ORDER BY。

有什么想法吗?

【问题讨论】:

标签: mysql


【解决方案1】:

好的,问题实际上是子查询 - 分别是 ORDER BY 和 LIMIT 语句。

当我省略 order by 和 limit 并使用以下查询时,它的速度与预期一样快(不到一秒):

DELETE backup FROM backup 
INNER JOIN user ON user.id = backup.userId
WHERE backup.id > 0 AND backup.id < 276 AND (state = 0 OR state IS NULL);

【讨论】:

    猜你喜欢
    • 2020-06-12
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 2022-09-17
    • 1970-01-01
    • 2019-03-07
    相关资源
    最近更新 更多