MySQL中IN和JOIN的执行顺序

Posted

技术标签:

【中文标题】MySQL中IN和JOIN的执行顺序【英文标题】:Execution sequence of IN and JOIN in MySQL 【发布时间】:2015-06-03 12:53:55 【问题描述】:

我有一个如下所示的 SQL 查询。

SELECT A.a, count(B.id)
FROM TableA A inner join TableA B on A.referId = B.id
WHERE A.id in (123,2424,232...)
GROUP BY A.id

执行此查询时

    首先使用 where 子句过滤行,然后执行连接或 先执行连接,然后过滤行?

我在 mysql 服务器上运行这个查询。假设 TableA 包含百万行。是否有任何替代且有效的方式来编写此查询?

【问题讨论】:

有参考吗? 视情况而定。优化器应该根据数据量、键等选择最快的方式。 @MichaelBerkowski,这是一个自我加入 @RaviChandra 我现在看到了 :)。 referId 上有索引吗?我假设id 有一个索引。 我们在referId 上没有索引。创建一个将有助于提高性能? 【参考方案1】:

执行顺序由查询计划器决定。

您可以通过创建索引来影响它。

对于这个查询,我建议将COUNT(b.ID) 更改为COUNT(*)。我还建议在(id, referId) 上创建一个compound index。这应该为您从表的第一个实例中需要的东西提供coverage。

有关查询性能的更多信息,这是一个极好的资源。 http://planet.mysql.com/entry/?id=661727

【讨论】:

【参考方案2】:

查询选择的行首先由 FROM 子句连接条件过滤,然后是 WHERE 子句搜索条件,然后是 HAVING 子句搜索条件。可以在 FROM 或 WHERE 子句中指定内连接,而不影响最终结果。

【讨论】:

以上是关于MySQL中IN和JOIN的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的逻辑查询语句的执行顺序

Mysql中查询语句的执行顺序

mysql五补充部分:SQL逻辑查询语句执行顺序

MySQL语法顺序及执行顺序

mysql执行顺序

mysql的关键词执行顺序