MySQL explain在“中显示1行”;“行”;当表中根本没有数据时

MySQL explain在“中显示1行”;“行”;当表中根本没有数据时,mysql,sql,Mysql,Sql,我有一张桌子: CREATE TABLE `test` ( `pk` INT(11) NOT NULL AUTO_INCREMENT, `index_col` INT(11) NULL DEFAULT '0', PRIMARY KEY (`pk`) ) ENGINE=InnoDB AUTO_INCREMENT=5 ; 表中根本没有数据 我有一个疑问: explain select * from test; 它在解释中显示: 行数:1 过滤:100 如果表中根本没有数据

我有一张桌子:

CREATE TABLE `test` (
    `pk` INT(11) NOT NULL AUTO_INCREMENT,
    `index_col` INT(11) NULL DEFAULT '0',
    PRIMARY KEY (`pk`)
)
ENGINE=InnoDB
AUTO_INCREMENT=5
;
表中根本没有数据

我有一个疑问:

explain select * from test;
它在解释中显示:

行数:1

过滤:100


如果表中根本没有数据,它从哪里得到那一行?

MySQL
中,
EXPLAIN
返回查询的执行计划,而不是实际结果。这是政府所说的:

当EXPLAIN与可解释语句一起使用时,MySQL显示 来自优化器的关于语句执行计划的信息。 也就是说,MySQL解释了它将如何处理该语句,包括 有关如何联接表以及联接顺序的信息

执行计划以表格格式表示,输出中的1
实际上是执行计划的行,而不是查询输出。此输出显示每个表1行,因此,如果查询中有多个表,则无论实际
SELECT
query的结果如何,都会在输出中看到2行


EXPLAIN
输出格式的详细说明。

好的,我已经调试了mysqld源代码,我发现:


n\u行=ib\u表->统计n\u行
是否尝试包含数据库架构?好的,让我们在表中添加4行:例如,前2行将具有
索引列=1
,最后2行具有
索引列=2
。然后执行:
分析表测试以更新统计信息。然后让我们再次执行explain:
explain select*from test wher index_col=1解释说:
行=4
。但据我所知,它应该显示5行:表中4行,执行计划本身1行。若我再添加两行,再次分析表,并执行相同的查询,explain将显示
行=6
(不是表中的7-6行,而是执行计划本身的1行)。好的,文档说:
对于InnoDB表,这个数字是一个估计值,可能并不总是精确的。
,我已经将表引擎更改为MyISAM,截断表,然后重新分析的表格-解释在
行中显示
NULL
-这是正确的。我在MyISAM表中添加了
2行
,重新分析的表-解释显示
2行
-这也是正确的。很好的侦查。
/*
The MySQL optimizer seems to assume in a left join that n_rows
is an accurate estimate if it is zero. Of course, it is not,
since we do not have any locks on the rows yet at this phase.
Since SHOW TABLE STATUS seems to call this function with the
HA_STATUS_TIME flag set, while the left join optimizer does not
set that flag, we add one to a zero value if the flag is not
set. That way SHOW TABLE STATUS will show the best estimate,
while the optimizer never sees the table empty.
However, if it is internal temporary table used by optimizer,
the count should be accurate */

if (n_rows == 0 && !(flag & HA_STATUS_TIME) <-- this expression is true
            && table_share->table_category != TABLE_CATEGORY_TEMPORARY) {
    n_rows++; <-- this code executes
}