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
输出已编辑为易读性。
答案 0 :(得分:39)
来自MySQL文档:
查询只包含聚合函数(MIN(),MAX()) 全部使用索引解析,或者为MyISAM使用COUNT(*),而不使用GROUP BY 条款。优化器确定只应返回一行。
基本上这意味着您的查询使用MySQL直接可用的数据,并且查询将在固定时间内运行。
答案 1 :(得分:27)
这意味着您已经完成了一个查询,除了计算表中的行数之外,该表只是一个MyISAM表。 MyISAM表存储有单独的行计数,因此要执行此查询,MySQL根本不需要查看任何表行数据。相反,它会立即返回预先计算的行数。因此,表访问被“优化掉”,查询速度非常快。
在InnoDB等MySQL中的其他存储引擎上也不会发生同样的情况。但实际上,出于各种其他原因,您希望在大多数情况下使用InnoDB而不是MyISAM。 (即使没有行计数优化,这种查询也非常非常快。)
select count(comment_count) from wp_posts;
这是你真正的意思吗?这与SELECT COUNT(*)...
相同(假设comment_count
不能是NULL
,它不可能或者你没有得到优化。如果您想要使用comment_count
,那么您应该使用SUM(comment_count)
,并且不会获得“优化离开”行为。
答案 2 :(得分:8)
这意味着表格已经完全优化了查询。你不能比这更好。
答案 3 :(得分:4)
接受的答案和最受欢迎的答案似乎表明此类解释仅适用于MyISAM表。但我在InnoDB表中看到了这一点。
我查看了这里的mysql文档,版本为5.6,https://dev.mysql.com/doc/refman/5.6/en/explain-output.html#explain_extra
我没有看到解释仅限于MyISAM。但是在COUNT(*)的特定情况下,有一条说明,如果该表是MyISAM,这种解释将变为有效。
'对于每个表保持精确行数的存储引擎(例如MyISAM,但不包括InnoDB),对于缺少WHERE子句或始终为true的COUNT(*)查询,可能会出现此Extra值。没有GROUP BY子句。 (这是隐式分组查询的一个实例,其中存储引擎会影响是否可以读取确定数量的行。)'
答案 4 :(得分:0)
很难说没有看到你的查询,但如果你选择了一个常数值,这将是后果 -
SELECT 1 FROM atable
或者您的一个或多个表格不需要回答这个问题。
答案 5 :(得分:0)
对于innodb表,我在查找具有auto_increment的列的最小值或最大值时看到了“选择优化的表”。 information_schema.tables保留了最大的auto_increment,因此优化器很容易看到那里,从不触摸用户表。它不适用于像count这样的东西,因为可能存在间隙,因此优化器必须转到用户表以获得答案。
答案 6 :(得分:0)
我不相信该表已完全从查询中优化。此查询“从 wm.task_inst_params 中选择 'wm.task_inst_params' 作为 table_name,count(id);”运行需要 18 分钟。该表有 224788138 行。
如果我尝试获得解释计划以了解为什么需要这么长时间,我会得到以下信息:“无法解释计划:选择优化掉的表”。
innodb_version 8.0.11