48

Select tables optimized awayMySQL解释计划 中的含义是什么?

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为易读性编辑输出。

4

7 回答 7

49

来自 MySQL 文档:

该查询仅包含使用索引解析的聚合函数(MIN()、MAX())或 MyISAM 的 COUNT(*),并且没有 GROUP BY 子句。优化器确定应该只返回一行。

基本上这意味着您的查询使用 MySQL 直接可用的数据,并且查询将在恒定时间内运行。

于 2011-09-30T00:39:50.903 回答
29

这意味着您已经完成了一个查询,它只计算表中的行数,并且该表是 MyISAM 表。MyISAM 表以单独的行数存储,因此执行此查询 MySQL 根本不需要查看任何表行数据。相反,它会立即返回预先计算的行数。因此,表访问被“优化”并且查询速度快如闪电。

同样的情况不会发生在 MySQL 中的其他存储引擎上,例如 InnoDB。但实际上,在大多数情况下,出于各种其他原因,您希望使用 InnoDB 而不是 MyISAM。(即使没有行数优化,这种查询也非常非常快。)

select count(comment_count) from wp_posts;

那是你真正想要做的吗?这与 just 相同SELECT COUNT(*)...(假设comment_countcan't be NULL,它不可能,否则您将无法获得优化)。如果您想要总共comment_count应该使用的 s SUM(comment_count),那么您将不会获得“优化后”的行为。

于 2010-01-02T19:34:47.887 回答
9

这意味着表在查询之外完全优化。你没有比这更好的了。

于 2010-01-02T18:24:38.963 回答
8

接受的答案和最受支持的答案似乎表明这种类型的解释仅适用于 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 子句或始终为真且没有 GROUP BY 子句的 COUNT(*) 查询,可能会出现此额外值. (这是一个隐式分组查询的实例,其中存储引擎影响是否可以读取确定的行数。)

于 2016-06-19T10:03:13.527 回答
1

对于 innodb 表,我在查找具有 auto_increment 的列的最小值或最大值时看到了“选择优化的表”。information_schema.tables 保持最大的 auto_increment,因此优化器很容易只看那里而从不接触用户表。它不适用于诸如计数之类的事情,因为可能存在间隙,因此优化器必须转到用户表以获得答案。

于 2017-12-28T23:37:13.553 回答
0

很难说没有看到您的查询,但如果您选择了一个常量值,这将是结果 -

从表中选择 1

或者您的一张或多张桌子不需要回答这个问题。

于 2010-01-02T18:21:20.673 回答
0

我不相信该表在查询之外已完全优化。此查询“select 'wm.task_inst_params' as table_name, count(id) from wm.task_inst_params;” 运行需要 18 分钟。该表有 224788138 行。

如果我尝试制定解释计划以了解为什么需要这么长时间,我会得到:“无法解释计划:选择优化后的表”。

innodb_version 8.0.11

于 2021-01-10T17:13:39.587 回答