什么会导致这个 SQL 插入到 运行 非常慢?

What would cause this SQL insert to run very slowly?

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

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)。起初我以为这是一个 table 问题,但我尝试了一个新的 table 并得到了类似的结果,所以查询一定有问题。磁盘很好,它是 运行 时全部 CPU 负载。我能够在几秒钟内复制整个位置 table(数万行)。

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
;