我知道计算SQL表中行数的最佳方法是count(*)(或等效count(PrimaryKey)).
这是O(1)吗?
如果没有,为什么不呢?
为什么不只是实现一个计数器并将其返回给这个特定的查询?是因为这个查询不是一个常见的用例吗?
如果答案根据SQL引擎而有所不同,我想听听它们之间的差异 - 但无论如何,我对生产SQL引擎中的实际实现感兴趣.
不,这不是一个常见的用例.我见过的大多数行数都涉及到where子句.
不实现这一点的主要原因是行计数器会导致多用户环境中的争用.每次插入或删除行时,计数器都需要更新,有效锁定每个插入/删除的整个表.
在一些 RDBM中,这是O(1)(最值得注意的是MySQL),把AFAIK放在它通常不赞成并被认为是"丑陋的性能黑客".原因是如果您有事务(每个真正的RDBM都应该有),表中的总行数可能会或可能不会等于您从当前事务中看到的总数.这就是服务器需要检查事务实际可见哪些行的原因,使其比O(1)更多O(n).
如果你想优化获取行数的过程并且对结果满意,大多数RDBM都有特殊的"信息"表,其中包含有关表的信息,包括大致的行数(同样,它不是精确的因交易而产生的行数).