开发者社区> 问答> 正文

MySQL-SELECT WHERE字段IN(子查询)-为什么极慢??mysql

我要检查的数据库中有几个重复项,因此,为了查看哪些重复项,我执行了以下操作:

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专家可以解释发生了什么吗?

展开
收起
保持可爱mmm 2020-05-17 18:36:53 1218 0
1 条回答
写回答
取消 提交回答
  • 将查询重写为此

    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

    2020-05-17 18:41:57
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像