什么会导致这个SQL插件运行得非常慢?

时间:2016-03-14 16:10:16

标签: mysql mariadb where-in

我使用子查询在系统中查找重复的行。

SELECT * FROM locations l2 WHERE l2.id IN (
    SELECT min(l1.id) FROM locations l1
    GROUP BY l1.address, l1.city, l1.industry_id
    HAVING count(*) > 1
)

这个查询执行得相当快,大约0.4秒。但是,如果我尝试在其周围包装插入物:

INSERT INTO duplicate_locations (
    SELECT * FROM locations l2 WHERE l2.id IN (
        SELECT min(l1.id) FROM locations l1
        GROUP BY l1.address, l1.city, l1.industry_id
        HAVING count(*) > 1
    )
)

这个查询花了 6分钟 100行。

系统上的其他所有内容都运行良好。表是相同的结构,MyISAM,MariaDB 5.5(没有EXPLAIN INSERT)。我一开始认为它是一个表问题,但我尝试了一个新表并得到了类似的结果,因此查询必定存在问题。磁盘很好,它在运行时都是CPU负载。我能够在几秒钟内复制整个位置表(数万行)。

1 个答案:

答案 0 :(得分:1)

MySQL WHERE子句中的子查询通常是性能杀手,除了最简单的情况之外应该避免,或者在不使用它们的情况下导致查询非常复杂,请尝试这样做:

INSERT INTO duplicate_locations 
    SELECT l0.* FROM locations AS l0
    INNER JOIN (
        SELECT min(id) AS firstID
        FROM locations
        GROUP BY address, city, industry_id
        HAVING count(*) > 1
    ) AS firstL 
    ON l0.id = firstL.firstID
;