我总是只使用"SELECT COUNT(1)FROM X",但也许这不是最有效的.有什么想法吗?其他选项包括SELECT COUNT(*)或者如果它是自动递增(并且从不删除),则可能获取最后插入的id.
如果我只是想知道桌子上是否有任何东西怎么样?(例如,计数> 0?)
gir*_*uid 12
最好的方法是确保您SELECT COUNT
在单个列上运行(SELECT COUNT(*)
速度较慢) - 但SELECT COUNT
始终是获取事物数量的最快方法(数据库在内部优化查询).
如果你查看下面的评论,你可以看到为什么SELECT COUNT(1)
可能是你最好的选择.
为了跟进 girasquid 的答案,作为一个数据点,我有一个包含 230 万行的 sqlite 表。使用select count(*) from table
,统计行数需要 3 秒多的时间。我还尝试使用SELECT count(rowid) FROM table
, (认为 rowid 是默认的主索引键),但这并没有更快。然后我在数据库中的一个字段上建立了索引(只是一个任意字段,但我选择了一个整数字段,因为我从过去的经验中知道,短字段上的索引可以非常快,我认为因为索引存储了一个副本索引本身的值)。SELECT count(my_short_field) FROM table
将时间缩短到不到一秒。
如果您确定(真正确定)从未从该表中删除任何行,并且您的表尚未使用WITHOUT ROWID 优化进行定义,您可以通过调用以下命令来获取行数:
select max(RowId) from table;
Run Code Online (Sandbox Code Playgroud)
或者,如果你的表是一个循环队列,你可以使用类似的东西
select MaxRowId - MinRowId + 1 from
(select max(RowId) as MaxRowId from table) JOIN
(select min(RowId) as MinRowId from table);
Run Code Online (Sandbox Code Playgroud)
这真的非常快(毫秒),但是你必须注意,因为 sqlite 说行 id 在同一个表中的所有行中是唯一的。SQLite 没有声明行 id 始终是连续的数字。