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

xv8emn3q  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(642)
  1. mysql> select count(*) from table where relation_title='xxxxxxxxx';
  2. +----------+
  3. | count(*) |
  4. +----------+
  5. | 1291958 |
  6. +----------+
  7. mysql> explain select * from table where relation_title='xxxxxxxxx';
  8. +----+-------------+---------+-
  9. | id | select_type | rows |
  10. +----+-------------+---------+-
  11. | 1 | SIMPLE | 1274785 |
  12. +----+-------------+---------+-

我认为“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行表的测试。

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

结果:

  1. COUNT(id)
  2. 512

下面是解释

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

结果:

  1. id rows
  2. 1 608
展开查看全部

相关问题