假设列pkey
是mysql表T
的主键。基于EXPLAIN输出:
此查询需要为DERIVED和PRIMARY选择每个只扫描一行(正如人们所期望的那样):
SELECT * FROM (SELECT * FROM T where pkey=10) t;
但是这个查询需要对两个 DERIVED和PRIMARY选择进行完整的线性扫描(这表明MySQL根本无法优化查询):
SELECT * FROM (SELECT * FROM T) t where pkey=10;
查询#2至少有两种可能的优化:它可以转换为#1,或者完全删除子查询(即将其更改为SELECT * FROM T where pkey=10
),还可能转换为其他。
有没有更深层次的原因导致MySQL无法优化查询,即优化是否有可能改变查询的可观察行为(在这种情况下,MySQL通过不优化它来做正确的事情)? / p>
PS:我正在运行MySQL 5.6.13版。
答案 0 :(得分:3)
MySQL实现了子查询。所以,当你写这个(修复为具有子查询的别名)时:
SELECT *
FROM (SELECT * FROM T) t
WHERE pkey = 10;
您告诉SQL引擎将T
复制到中间临时表中。此表没有索引,因此此查询比第一个版本贵得多。
这是MySQL的特色。几乎任何其他数据库都可以正确处理。我认为即使是MS Access也可以。