MySQL中IN和JOIN的执行顺序

Execution sequence of IN and JOIN in MySQL

我有一个 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 包含百万行。是否有其他有效的方式来编写此查询?

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

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

对于此查询,我建议将 COUNT(b.ID) 更改为 COUNT(*)。我还建议从 table.

的第一个实例中为您需要的东西创建一个 compound index on (id, referId). That should provide coverage

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

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