SELECT * FROM Table
VS SELECT * FROM (SELECT * FROM Table AS A) AS B
我的问题是:首先,SELECT *是否涉及对表中行的迭代,还是只是将所有行作为块返回而不进行任何迭代(因为没有给出WHERE子句),如果是这样的话,嵌套示例二中的查询涉及迭代表两次,并且将占用第一次查询的2倍?感谢...
答案 0 :(得分:2)
这个问题的答案取决于你是否在5.7之前或5.7之后使用mysql。我可能会略微改变你的问题,但希望以下内容能够捕捉到你所追求的内容。
您的commentView
通过聚集索引(物理排序)进行表扫描。在没有主键的情况下,引擎可以使用implicitly。你说的没有where子句。不会尝试过滤或选择其他索引。
Explain输出(请参阅also)在摘要中显示1行。这是相对直接的。派生表SELECT * FROM Table
的解释输出和性能将根据您是否使用5.7之前的版本或5.7之后的版本而有所不同。
文档Derived Tables in MySQL 5.7很好地描述了版本5.6和5.7,后者由于物化派生表输出的变化被合并到外部查询中而没有提供任何惩罚。在以前的版本中,使用派生的临时表来承受相当大的开销。
在5.7之前测试性能损失是非常容易的。所需要的只是一个中等大小的表,以查看您的问题派生表对影响性能的显着影响。以下示例位于5.6版的小表中:
B
注意,我确实更改了问题,但它说明了派生表的影响以及它们在5.7之前的版本中与优化器一起使用的索引缺失。派生表在实现时会从索引中受益。但此后它作为临时表持续开销,并且在没有索引使用的情况下被合并到外部查询中。 5.7版
中的情况并非如此