我使用子查询在系统中查找重复的行。
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负载。我能够在几秒钟内复制整个位置表(数万行)。
答案 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
;