【发布时间】:2019-05-17 17:29:41
【问题描述】:
我想知道是否可以创建一个 SQLite 数据库,我可以在其中使用 O(1) 将 select 行通过 rowid 进行。
我开始在我的一个项目中使用 sqlite 数据库,发现来自较大数据库的 selecting 行比来自较小数据库的 selecting 行花费的时间更长。我开始在网上搜索并偶然发现this article。显然,当select 被rowid 调用时,SQLite 不会直接访问rowid,而是执行二分搜索以获取请求的rowid。这是一个非常合乎逻辑的解决方案,因为我们可以从数据库中删除行,在这种情况下,直接访问rowid 是行不通的。
但就我而言 - 我有一个“不可变”的数据库,在创建数据库之后我没有更改它;因此,所有rowid 都存在且顺序正确。
所以我在徘徊是否可以创建一个特殊的数据库或使用一个特定的查询命令告诉 SQLite 通过访问 rowid 而无需任何二进制搜索来选择。
如果有其他 SQLite 替代品可以更好地满足我的情况,请告知我(不过,在我的项目中,我无法将数据库加载到内存中,并且同时访问不同的数据库应该是即时的)
谢谢。
【问题讨论】:
-
你试过 WITHOUT ROWID 表吗? - sqlite.org/withoutrowid.html
-
“我有一个“不可变”的数据库,在创建数据库后我不会更改它;“......是的,但是数据库(SQLite)应该如何知道并优化它......它不是只有 SQLite,当数据在 de 索引中变大(使用 B-tree)时,MySQL 也会使用更多 seeks。“如果 SQLite 有其他替代品可以更好地为我的情况执行”所以很可能其他 RDBMS 也适用使用 B-tree 索引时那样...
-
"如果 SQLite 有其他替代品可以更好地满足我的情况" 对于您没有提供表结构、示例数据和/或正在运行的查询的情况,我建议您阅读 @ 987654324@ 并为我们提供文本格式的示例数据、
CREATE TABLE语句和文本格式的预期结果......此外,您还应该告诉我们有多少用户连接到 SQLite 数据库以及 pyhon 应用程序或多或少是如何工作的跨度> -
@RaymondNijland,我根据我在这个线程stackoverflow.com/questions/53483493/… 中得到的建议选择了 SQLite,我需要在不加载文件的情况下即时访问文件中的一行。既然我得到了关于 dbm 的建议,我可能会研究这个选项。
-
Sqlite rowid 表使用 B*-trees,因此具有 O(n) 查找时间。您无法更改此设置。