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

xv8emn3q  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(538)
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 | 
+----+-------------+---------+-

我认为“explain select*from table where relationship_title='';”按索引返回关系标题=''的行。但它比真正的数字小。

ma8fv8wu

ma8fv8wu1#

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

beq87vna

beq87vna2#

这个 EXPLAIN 查询将使用 INFORMATION_SCHEMA 表,它包含了innodb表的行数的粗略估计-请参阅mysql docs中关于information_schema.tables的notes部分。

7d7tgy0s

7d7tgy0s3#

它显示了为得到结果而运行的行数。
错误数据的原因是explain不准确,它根据存储在表中的信息对数据进行猜测。
这是非常有用的信息,例如,在许多表上执行联接时,您希望确保没有在整个联接表中为每一行运行一行信息。
这是一个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

相关问题