Sqlite3:插入时禁用主键索引?

Sqlite3:插入时禁用主键索引?,sqlite,indexing,insert,primary-key,Sqlite,Indexing,Insert,Primary Key,我有一个Sqlite3数据库,它有一个表和一个主键,主键由两个整数组成,我正在尝试向其中插入大量数据(大约1GB) 我遇到的问题是,创建主键也会隐式创建一个索引,在我的例子中,这会在几次提交后阻碍对爬网的插入(这可能是因为数据库文件位于NFS上) 所以,我想暂时禁用该索引。到目前为止,我最好的计划是删除主键的自动索引,但是SQLite似乎不喜欢它,如果我尝试这样做,就会抛出一个错误 我的第二个最佳方案是应用程序在网络驱动器上创建数据库的透明副本,进行修改,然后将其合并回来。注意,与大多数SQli

我有一个Sqlite3数据库,它有一个表和一个主键,主键由两个整数组成,我正在尝试向其中插入大量数据(大约1GB)

我遇到的问题是,创建主键也会隐式创建一个索引,在我的例子中,这会在几次提交后阻碍对爬网的插入(这可能是因为数据库文件位于NFS上)

所以,我想暂时禁用该索引。到目前为止,我最好的计划是删除主键的自动索引,但是SQLite似乎不喜欢它,如果我尝试这样做,就会抛出一个错误

我的第二个最佳方案是应用程序在网络驱动器上创建数据库的透明副本,进行修改,然后将其合并回来。注意,与大多数SQlite/NFS问题相反,我不需要访问并发性

这样做的正确方法是什么

更新:

我忘记指定我已经使用的标志:

PRAGMA synchronous = OFF
PRAGMA journal_mode = OFF
PRAGMA locking_mode = EXCLUSIVE
PRAGMA temp_store = MEMORY
更新2:
事实上,我正在批量插入项目,但是下一批提交的速度比上一批慢(我假设这与索引的大小有关)。我试着批量处理10k到50k之间的元组,每个元组都是两个整数和一个浮点。

您是否将每个新元组的
插入作为一个单独的事务处理

如果成批使用和插入行,则我认为索引只能在每个事务结束时重建。

请参阅

  • 无法删除嵌入索引,因为它是行的唯一地址

  • 将两个整数键合并到一个long key=(key1它会的。我也正打算建议:)是的,但是我可以将整个千兆字节压缩到一个事务中吗?我几乎是无意中这样做的(根本忘了把commit语句放在任何地方),在中途我遇到了一些磁盘I/O错误,尽管我不确定它是否相关……保持每个INSERT语句的数据量与cache_size参数保持一致似乎可以做到这一点。显然,缓存越多,一次可以插入的项目就越多。而且看起来我可以在每件事结束时都做一次承诺。好吧,你可以。但是O(1)的任何插入操作的主要技巧是填充按该索引排序的数据,但是如果数据适合内存缓存,那么一切都非常快。保持提交大小小于缓存大小是合理的,否则sqlite将被迫在磁盘上移动它。