SQLite通过使用O(1)而不是O(log(N))的rowid选择吗?

时间:2018-12-17 10:52:15

标签: python database sqlite

我想知道是否可以创建一个SQLite数据库,在其中我可以用O(1)用select rowid行。

我开始在我的一个项目中使用sqlite数据库,并发现select从较大数据库中的行比select从较小数据库中的行花费的时间更长。我开始在线搜索,偶然发现this article。显然,当用select rowid进行访问时,SQLite不会直接进入rowid,而是执行二进制搜索来获取请求的rowid。这是一个非常合乎逻辑的解决方案,因为我们可以从数据库中删除行,在这种情况下,直接进入rowid是行不通的。 但就我而言-我有一个“不可变的”数据库,创建数据库后,我没有对其进行更改;因此,所有rowid都以正确的顺序出现。

因此,我想知道是否可以创建一个特殊的数据库或使用特定的查询命令,该命令告诉SQLite通过访问rowid进行选择而无需任何二进制搜索。

如果还有其他SQLite替代方案可以更好地满足我的情况,请通知我(尽管在我的项目中,我无法将数据库加载到内存中,并且同时访问不同的数据库应该是瞬时的)< / p>

谢谢。

2 个答案:

答案 0 :(得分:1)

如果不需要SQLite的全部功能,则可以使用带有dbm模块的简单哈希算法。它使用散列,并且性能可能比ISAM索引更好。但是您将失去排序(在其他功能中,例如SQL ...)

答案 1 :(得分:0)

我最终使用了mmap。因为我有数百万行相同长度的行,所以我只是使用mmap将这些行保存到二进制文件中。然后访问k线,我只是简单地要求mmap从k * (length_of_line)点读取。

我使用答案here中的代码段来快速测试解决方案,尽管我相信它可以比此简单代码进一步优化。