我在使用mysql,这是查询-
mysql> select count(*) from payments as Payment WHERE `Payment`.`fordate` BETWEEN '2015-11-28 00:00:00' AND '2015-12-31 23:59:59';
+----------+
| count(*) |
+----------+
| 187216 |
+----------+
1 row in set (0.16 sec)
mysql> explain select count(*) from payments as Payment WHERE `Payment`.`fordate` BETWEEN '2015-11-28 00:00:00' AND '2015-12-31 23:59:59';
+----+-------------+---------+-------+-----------------+-----------------+---------+------+--------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+-----------------+-----------------+---------+------+--------+--------------------------+
| 1 | SIMPLE | Payment | range | pafordate_index | pafordate_index | 5 | NULL | 379894 | Using where; Using index |
+----+-------------+---------+-------+-----------------+-----------------+---------+------+--------+--------------------------+
1 row in set (0.04 sec)为什么在解释行数太多,但在实际中,它是较少。
发布于 2015-12-11 06:38:29
桌子是InnoDB吗?因此,索引统计信息是由“指数潜水”收集的,而且根据定义是不精确的。
EXPLAIN实际上不是在执行查询,而是使用估计值来规划查询,从而显示那些不精确的数字。
重要的是,如果它将数字保持在与现实相同的顺序(在你的情况下,它是一个双倍),那么它对大多数情况都足够好。
在事务性环境中,保持精确的数字太麻烦了,甚至不太可能。
发布于 2015-12-12 17:26:17
在您的查询中,如果没有索引Payment.fordate,优化器希望搜索整个表。因为您只返回count(*)值,所以只返回一行。添加一个额外的列和一个group by子句可以改变预期返回的行数。
根据数据库中的统计数据解释计划使用估计数据。这些数据通常是错误的,但足够接近建立一个合理的计划。通常,数量级是计算的,而不是实际值。
由于在构造中间子句的计数时出错,该值可能会以2的因数被舍弃。
发布于 2015-12-11 05:37:30
解释计划只是简单地向您显示它必须排序多少行,才能得到结果。
如果要删除where子句并从表格_名字中执行"select计数(*)“,那么它将返回表中所有行的计数,您的解释计划将与总数匹配。
https://dba.stackexchange.com/questions/123430
复制相似问题