DELETE运行时间长于SELECT

时间:2016-02-09 16:51:50

标签: mysql sql

下面的DELETE查询运行方式比同一个SELECT语句长。为了进行比较,SELECT查询运行1分钟,DELETE查询运行超过5分钟,实际超时。为什么会发生这种情况?如何防止这种情况发生?

选择查询(1分钟)

SELECT 
    *
FROM
    company
WHERE
    symbol IN (SELECT 
            `hd`.`symbol` AS `symbol`
        FROM
            (`stockton`.`historical_data` `hd`
            JOIN (SELECT 
                MAX(`stockton`.`historical_data`.`histDate`) AS `maxhd`
            FROM
                `stockton`.`historical_data`) `m`)
        GROUP BY `hd`.`symbol` , `m`.`maxhd`
        HAVING (MAX(`hd`.`histDate`) < (NOW() - INTERVAL 7 DAY)));

删除查询(5分钟以上)

DELETE
FROM
    company
WHERE
    symbol IN (SELECT 
            `hd`.`symbol` AS `symbol`
        FROM
            (`stockton`.`historical_data` `hd`
            JOIN (SELECT 
                MAX(`stockton`.`historical_data`.`histDate`) AS `maxhd`
            FROM
                `stockton`.`historical_data`) `m`)
        GROUP BY `hd`.`symbol` , `m`.`maxhd`
        HAVING (MAX(`hd`.`histDate`) < (NOW() - INTERVAL 7 DAY)));

1 个答案:

答案 0 :(得分:0)

改进:您可能希望更改查询以在编程语言中计算ALTER ROLE postgreSQL NOLOGIN; ERROR: role "postgresql" does not exist ,而不是在查询本身中计算。

删除花费更多时间:删除通常会花费更多时间,如果你将google,你会发现你并不孤单。原因是与Select相比,Delete是一项昂贵的操作,因为删除需要以下内容: 1)将记录与您的情况进行比较 2)从表中删除 3)从表上创建的一个或多个索引中删除引用 4)可能会也可能不会根据引擎更新表的元数据

而选择是: 1)将记录与您的条件进行比较,或者如果条件使用Index,则使用索引 2)返回结果值

考虑到你有更大的表,你可能会有更大的索引,与仅选择相比,操作需要时间。

但是你可以尝试建议的改进,并且应该及时看到一些改进。