当前位置:  开发笔记 > 后端 > 正文

在O(1)中计算SQL表中的行

如何解决《在O(1)中计算SQL表中的行》经验,为你挑选了2个好方法。

我知道计算SQL表中行数的最佳方法是count(*)(或等效count(PrimaryKey)).

    这是O(1)吗?

    如果没有,为什么不呢?

为什么不只是实现一个计数器并将其返回给这个特定的查询?是因为这个查询不是一个常见的用例吗?

如果答案根据SQL引擎而有所不同,我想听听它们之间的差异 - 但无论如何,我对生产SQL引擎中的实际实现感兴趣.



1> James Anders..:

不,这不是一个常见的用例.我见过的大多数行数都涉及到where子句.

不实现这一点的主要原因是行计数器会导致多用户环境中的争用.每次插入或删除行时,计数器都需要更新,有效锁定每个插入/删除的整个表.



2> Grey Panther..:

一些 RDBM中,这是O(1)(最值得注意的是MySQL),把AFAIK放在它通常不赞成并被认为是"丑陋的性能黑客".原因是如果您有事务(每个真正的RDBM都应该有),表中的总行数可能会或可能不会等于您从当前事务中看到的总数.这就是服务器需要检查事务实际可见哪些行的原因,使其比O(1)更多O(n).

如果你想优化获取行数的过程并且对结果满意,大多数RDBM都有特殊的"信息"表,其中包含有关表的信息,包括大致的行数(同样,它不是精确的因交易而产生的行数).


如果使用MyISAM,则MySQL为O(1) - 来自手册http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_count:"COUNT(*)已优化为如果SELECT从一个表中检索,没有检索到其他列,并且没有WHERE子句,则返回非常快." ..."此优化仅适用于MyISAM表,因为为此存储引擎存储了精确的行数,并且可以非常快速地访问."
推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有