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

时间:2015-05-08 00:44:55

标签: mysql sql database query-optimization

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

  1. 此查询需要为DERIVED和PRIMARY选择每个只扫描一行(正如人们所期望的那样):

      

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

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

      

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

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

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

    PS:我正在运行MySQL 5.6.13版。

1 个答案:

答案 0 :(得分:3)

MySQL实现了子查询。所以,当你写这个(修复为具有子查询的别名)时:

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

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

这是MySQL的特色。几乎任何其他数据库都可以正确处理。我认为即使是MS Access也可以。