MySQL解释计划中“Select tables optimized away”的含义
在MySQL解释计划中Select tables optimized away
的含义是什么?
explain select count(comment_count) from wp_posts; +----+-------------+---------------------------+-----------------------------+ | id | select_type | table,type,possible_keys, | Extra | | | | key,key_len,ref,rows | | +----+-------------+---------------------------+-----------------------------+ | 1 | SIMPLE | all NULLs | Select tables optimized away| +----+-------------+---------------------------+-----------------------------+ 1 row in set (0.00 sec)
注意: explain plan
为易读性编辑的explain plan
输出。
这意味着你已经完成了一个查询,除了计算表中的行数外,该表是MyISAM表。 MyISAM表存储在一个单独的行数,所以要做这个查询MySQL根本不需要查看任何表行数据。 而是立即返回预先计算的行数。 因此表访问被“优化”,查询速度非常快。
在InnoDB等MySQL的其他存储引擎上也不会发生这种情况。 但是,实际上,由于各种其他原因,您希望在大多数情况下使用InnoDB而不使用MyISAM。 (即使没有行数优化这种查询是非常,非常快。)
select count(comment_count) from wp_posts;
这是你真正想要做什么? 就像SELECT COUNT(*)...
(假设comment_count
不能是NULL
,不可能是或者你没有得到优化)。 如果你想要总共的comment_count
你应该使用SUM(comment_count)
,你不会得到'优化离开'的行为。
从MySQL文档:
查询只包含所有使用索引parsing的聚合函数(MIN(),MAX()),对于MyISAM则使用COUNT(*),而不包含GROUP BY子句。 优化器确定只有一行应该返回。
基本上这意味着你的查询使用直接可用于MySQL的数据,并且查询将在一段时间内运行。
这意味着表格是完全优化的查询。 你不能比这更好。
接受的答案和最有回报的答案似乎表明这种解释只适用于MyISAM表格。 但是我用InnoDB表来看到这个。
我查阅了这里的MySQL文档5.6版, https://dev.mysql.com/doc/refman/5.6/en/explain-output.html#explain_extra
我没有看到这个解释仅限于MyISAM。 但是在COUNT(*)的具体情况下,有一个说明,说这种types的解释在MyISAM表中是有效的。
'对于每个表(例如MyISAM,而不是InnoDB)保持精确行数的存储引擎,对于COUNT(*)查询,WHERE子句缺失或始终为真,并且没有GROUP BY子句。 (这是隐式分组查询的一个实例,存储引擎会影响是否可以读取确定数量的行)
很难说没有看到你的查询,但这将是如果你例如select一个常数值的结果 –
select1从可用
或者您的一个或多个表格不需要回答问题。