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的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章