MySQL的COUNT()函数是估计吗?

时间:2009-08-16 17:49:09

标签: mysql

我连续三次在MyISAM表上执行了以下查询:

mysql> SELECT COUNT(*) FROM tickets WHERE created_time BETWEEN UNIX_TIMESTAMP() - 86400 * 20 AND UNIX_TIMESTAMP() - 86400 * 19;

ticket表只接收insert_,其中created_time列设置为UNIX_TIMESTAMP(),永远不会删除行,并且永远不会更新行的created_time。尽管如此,我得到的结果是154324,154326和154325(按此顺序)。这导致我相信COUNT()函数不会返回确切的数字,但是我对MySQL文档和网络其余部分的简要搜索没有提到这一点。有没有人知道COUNT()究竟做了什么?

3 个答案:

答案 0 :(得分:5)

你得到的结果有什么问题?

当你运行查询时,时间窗口正在移动 - 前两个新结果进入窗口,然后一个旧结果出来(太旧)。

对于不同的方案,COUNT的实现方式不同。如果不使用WHERE限制查询并且在单个表上执行查询,则使用一些存储的内部计数器来生成结果。如果限制查询,则首先使用表数据或索引过滤结果,然后计算结果行。

答案 1 :(得分:3)

计算行数。究竟。每次运行它时,UNIX_TIMESTAMP都不同,因此使where子句不同。

这完全是预期的行为。

答案 2 :(得分:-1)

myIsam表上的count(*)有几个问题,因为MyIsam使用索引(而不是innodb进行表扫描)进行计数,因此索引可能存在一些问题....

您使用的是哪个版本的mysql?