【发布时间】:2011-09-02 09:13:45
【问题描述】:
我想检查一个数据库中有几个重复项,所以我做了什么来查看哪些是重复项,我这样做了:
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
这样,我将获得所有相关字段出现不止一次的行。此查询需要几毫秒才能执行。
现在,我想检查每个重复项,所以我想我可以在上面查询中使用相关字段选择 some_table 中的每一行,所以我这样做了:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
)
由于某种原因,这变得非常缓慢(需要几分钟)。这里到底发生了什么让它这么慢?相关字段已编入索引。
最终我尝试从第一个查询 (SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1) 创建一个视图“temp_view”,然后像这样进行第二个查询:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM temp_view
)
而且效果很好。 MySQL 在几毫秒内完成此操作。
这里有任何 SQL 专家可以解释发生了什么吗?
【问题讨论】:
-
你到底想要什么?想要删除除一个之外的重复条目??建议:请阅读Self Join
-
显然是慢的group-by ...
-
第一个查询以毫秒为单位执行(使用 HAVING 进行分组和过滤)。它仅与其他查询结合使用会使一切变慢(需要几分钟)。
-
@diEcho,我想查找重复项,检查它们,然后手动删除一些。