为什么 mysql 不优化这个简单的查询
Why doesn't mysql optimize this simple query
假设列 pkey
是 mysql table T
的主键。基于 EXPLAIN 输出:
对于 DERIVED 和 PRIMARY select,此查询只需要扫描 1 行(正如人们所期望的那样):
SELECT * FROM (SELECT * FROM T where pkey=10) t;
但是这个查询需要对 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 也是如此。
假设列 pkey
是 mysql table T
的主键。基于 EXPLAIN 输出:
对于 DERIVED 和 PRIMARY select,此查询只需要扫描 1 行(正如人们所期望的那样):
SELECT * FROM (SELECT * FROM T where pkey=10) t;
但是这个查询需要对 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 也是如此。