什么会导致这个 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
;
我正在使用子查询查找系统中的重复行。
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
;