14
    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' 的行。但它比真正的数字小。

4

4 回答 4

14

它显示了它运行了多少行以获得您的结果。

错误数据的原因是 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
于 2009-06-24T10:09:23.347 回答
6

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

于 2009-06-24T10:22:20.873 回答
5

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

于 2017-08-12T09:13:24.293 回答
1

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

解释行的 mysql 文档指出:

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 需要经过的所有行才能给你答案。在这种情况下,这就是整个表。

于 2021-02-18T21:02:54.050 回答