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

ZA.*_*ZA. 10 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 | 
+----+-------------+---------+-
Run Code Online (Sandbox Code Playgroud)

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

Óla*_*age 13

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

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

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

这是对608行表的测试.

SELECT COUNT(id) FROM table WHERE user_id = 1
Run Code Online (Sandbox Code Playgroud)

结果:

COUNT(id)
512
Run Code Online (Sandbox Code Playgroud)

这是解释

EXPLAIN SELECT COUNT(id) FROM table WHERE user_id = 1
Run Code Online (Sandbox Code Playgroud)

结果:

id  rows
1   608
Run Code Online (Sandbox Code Playgroud)


sou*_*rge 6

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


Pet*_*kov 5

执行ANALYZE TABLE table_name;- 它将更新 EXPLAIN 使用的统计信息,您将获得正确的数字。例如:当表中根本没有数据时,EXPLAIN 会建议该表为空并优化查询以首先基于该表进行过滤(因为它不从磁盘、内存等读取任何内容)。然后当你不执行数据加载时ANALYZE TABLE table_name;,优化器仍然建议表仍然是空的,并且不使用最佳执行计划进行查询。EXPLAIN 的行为方式相同 - 它不查找表中当前的行数,而是查找由ANALYZE TABLE table name(在某些情况下自动执行的 - 例如表中行数的 1/16 已更改)生成的统计信息。