为什么 mysql 不优化这个简单的查询

Why doesn't mysql optimize this simple query

假设列 pkey 是 mysql table T 的主键。基于 EXPLAIN 输出:

  1. 对于 DERIVED 和 PRIMARY select,此查询只需要扫描 1 行(正如人们所期望的那样):

    SELECT * FROM (SELECT * FROM T where pkey=10) t;

  2. 但是这个查询需要对 DERIVED 和 PRIMARY select 做一个完整的线性扫描(这表明 MySQL 是根本无法优化查询):

    SELECT * FROM (SELECT * FROM T) t where pkey=10;

查询 #2 至少有两种可能的优化:它可以转换为 #1,或者完全删除子查询(即将其更改为 SELECT * FROM T where pkey=10),以及可能的其他优化。

MySQL 无法优化查询是否有更深层次的原因,即优化是否有可能改变查询的可观察行为(在这种情况下 MySQL 正在做通过不优化它是正确的事情)?

PS: 我是运行MySQL版本5.6.13.

MySQL 实现子查询。所以,当你写这个时(固定为子查询的别名):

SELECT *
FROM (SELECT * FROM T) t
WHERE pkey = 10;

您正在告诉 SQL 引擎将 T 复制到中间临时 table。此 table 没有索引,因此此查询比第一个版本昂贵得多。

这是MySQL的一个特点。几乎任何其他数据库都能正确处理这个问题。我认为即使是 MS Access 也是如此。