代码之家  ›  专栏  ›  技术社区  ›  Richard Simões

mysql的count()函数是一个估计值吗?

  •  3
  • Richard Simões  · 技术社区  · 15 年前

    我连续三次对myisam表执行以下查询:

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

    Tickets表只接收将created_time列设置为unix_timestamp()的插入,从不删除行,并且从不更新行的created_time。尽管如此,我得到的结果是154324、154326和154325(按顺序)。这让我相信count()函数没有返回确切的数字,但是我对MySQL文档和其他Web文档的简短搜索没有提到这个问题。有人知道count()是什么吗?

    3 回复  |  直到 15 年前
        1
  •  5
  •   Filip Navara    15 年前

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

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

    对于不同的场景,计数的实现方式不同。如果不使用WHERE限制查询,并且查询是在单个表上执行的,那么将使用一些存储的内部计数器来生成结果。如果限制查询,则首先使用表数据或索引筛选结果,然后对结果行进行计数。

        2
  •  3
  •   Eric    15 年前

    它计算行数。确切地。每次跑步, UNIX_TIMESTAMP 是不同的,因此 where 条款不同。

    这完全是预期的行为。

        3
  •  -1
  •   Jaime    15 年前

    myisam表上的count(*)有几个问题,因为myisam使用索引(而不是进行表扫描的innodb)进行计数,所以您的索引可能有一些问题……

    你在使用什么版本的MySQL?