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'的行。但它比真正的数字小。
答案 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 需要通过才能给出答案的所有行。在这种情况下,这就是整个表格。