【问题标题】:Execution sequence of IN and JOIN in MySQLMySQL中IN和JOIN的执行顺序
【发布时间】: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

执行此查询时

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

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

【问题讨论】:

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

标签: mysql sql performance query-optimization


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-10
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2012-05-28
      相关资源
      最近更新 更多