为什么行返回“explain”不等于count()?

时间:2009-06-24 10:07:38

标签: mysql count explain

    mysql> select count(*) from table where relation_title='xxxxxxxxx';
+----------+
| count(*) |
+----------+
|  1291958 |
+----------+

mysql> explain select *  from table where relation_title='xxxxxxxxx';
+----+-------------+---------+-
| id | select_type | rows    |
+----+-------------+---------+-
|  1 | SIMPLE      | 1274785 | 
+----+-------------+---------+-

我认为“解析select * from table where relation_title ='xxxxxxxxx';”通过索引返回relation_title ='xxxxxxxxx'的行。但它比真正的数字小。

3 个答案:

答案 0 :(得分:13)

它显示了为了获得结果而经过的行数。

错误数据的原因是EXPLAIN不准确,它会根据您表格中存储的信息猜测您的数据。

这是非常有用的信息,例如在许多表上执行JOINS并且您希望确保没有在整个连接表中运行每行的一行信息。

这是对608行表的测试。

SELECT COUNT(id) FROM table WHERE user_id = 1

结果:

COUNT(id)
512

这是解释

EXPLAIN SELECT COUNT(id) FROM table WHERE user_id = 1

结果:

id  rows
1   608

答案 1 :(得分:6)

EXPLAIN查询将使用INFORMATION_SCHEMA表中提供的值,其中包含innodb表行数的粗略估计值 - 请参阅mysql docs on INFORMATION_SCHEMA.TABLES中的注释部分。

答案 2 :(得分:0)

OP 的问题是有效的,但从答案来看,我认为对解释的 rows 列实际上告诉我们的内容存在误解。

the mysql documentation for explain rows 声明:

<块引用>

行列表示 MySQL 认为它必须检查以执行查询的行数。

那么 COUNT(*) 告诉您的内容和解释行告诉您的内容是两种不同的事情,它们可能会产生相同的数字,但它们并不是相同的信息。

第一个是与正在运行的查询匹配的所有行的计数。第二个是对运行查询需要检查的所有行的估计。

所以当我跑步时

SELECT COUNT(id) FROM table WHERE user_id = 1

我得到 user_id = 1 的行数。

当我跑步时

EXPLAIN SELECT COUNT(id) FROM table WHERE user_id = 1

rows 列包含 mysql 需要通过才能给出答案的所有行。在这种情况下,这就是整个表格。