我在Sqlite数据库中有一个表,有很多行。我需要获取行数(表中的项目总数)。
我尝试了select count(*) from table
,但这似乎访问了每一行而且速度非常慢。
我也试过select max(rowid) from table
。这很快,但不是很安全 - 可以重复使用ID,表可以是空的等等。这更像是一个黑客攻击。
有关如何快速,干净地找到表格大小的任何想法?
使用Python 2.5的sqlite3版本2.3.2,它使用Sqlite引擎3.4.0。
答案 0 :(得分:1)
你是否在非空列上有任何索引(例如主键)?如果是,则可以扫描索引(希望不会花那么长时间)。如果没有,全表扫描是统计所有行的唯一方法。
答案 1 :(得分:1)
获取表的行号的其他方法是使用一个触发器来存储其他表中的实际行数(每个插入操作都会增加一个计数器)。 这样插入新记录会慢一点,但你可以立即得到行数。
答案 2 :(得分:0)
为了跟进Thilo的回答,作为一个数据点,我有一个包含230万行的sqlite表。使用select count(*) from table
,计算行数需要3秒钟。我也尝试使用SELECT rowid FROM table
,(认为rowid是默认的主索引键),但这并不快。然后我在数据库中的一个字段上做了一个索引(只是一个任意字段,但我选择了一个整数字段,因为我从过去的经验中知道短字段上的索引可以非常快,我认为因为索引存储了一个副本索引本身的价值)。 SELECT my_short_field FROM table
将时间缩短到不到一秒钟。