我要检查的数据库中有几个重复项,因此,为了查看哪些重复项,我执行了以下操作:
SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 这样,我将获得与related_field一起出现的所有行不止一次。该查询需要毫秒来执行。
现在,我想检查每个重复项,因此我想可以在上述查询中选择带有some_table的每一行以及一个related_field,因此我做到了:
SELECT * FROM some_table WHERE relevant_field IN ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) 由于某种原因,这实际上是缓慢的(需要几分钟)。到底是什么使它变慢了?related_field已建立索引。
最终,我尝试从第一个查询创建视图“ temp_view” (SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1),然后像这样进行第二个查询:
SELECT * FROM some_table WHERE relevant_field IN ( SELECT relevant_field FROM temp_view ) 而且效果很好。MySQL在几毫秒内完成了此操作。
这里有任何SQL专家可以解释发生了什么吗?
将查询重写为此
SELECT st1., st2.relevant_field FROM sometable st1 INNER JOIN sometable st2 ON (st1.relevant_field = st2.relevant_field) GROUP BY st1.id / list a unique sometable field here*/ HAVING COUNT(*) > 1 我认为st2.relevant_field必须在select中,因为否则该having子句将给出错误,但我不确定100%
切勿IN与子查询一起使用;众所周知,这很慢。 仅用于IN固定值列表。
更多提示
如果您想更快地进行查询,请不要SELECT *只选择您真正需要的字段。 确保您有索引relevant_field以加快等联接。 确保group by在主键上。 如果您使用的是InnoDB,并且仅选择索引字段(并且事情不太复杂),那么MySQL将仅使用索引来解决您的查询,从而加快了工作速度。 90%的IN (select 查询的通用解决方案
使用此代码
SELECT * FROM sometable a WHERE EXISTS ( SELECT 1 FROM sometable b WHERE a.relevant_field = b.relevant_field GROUP BY b.relevant_field HAVING count(*) > 1) 来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。