一尘不染

在SQLite中count(*)是固定时间的吗?如果不是,那么有什么替代方法吗?

sql

我正在寻找一种最好的方法来计算大型(超过1500万行)表中的行数。select count(*) from table;根据我在此问题上发现的一些较早的帖子,显然天真的方法是O(n),例如http://osdir.com/ml/sqlite-
users/2010-07/msg00437.html。

是否有恒定的时间机制来获取此信息,否则,是否存在直接select count(*)查询的首选替代方案?


阅读 126

收藏
2021-05-16

共1个答案

一尘不染

SQLite对COUNT(*)不带WHERE子句的情况进行了特殊的优化,它遍历表的B树页面并对条目进行计数,而无需实际加载记录。但是,这仍然需要访问表的所有数据(大记录的溢出页除外),因此运行时仍为O(n)。

SQLite不会在数据库中存储单独的记录计数,因为这会使所有更改变慢。

2021-05-16