高效地更新有许多记录的SQLite表

4 人关注

我正试图在一个项目中使用sqlite(sqlite3)来存储数十万条记录(希望使用sqlite,这样程序的用户就不必运行[我的]sql服务器)。

我有时要更新几十万条记录,以输入左右的值(它们是分层的),但发现标准的

update table set left_value = 4, right_value = 5 where id = 12340;

是非常缓慢的。我曾试着每隔一千左右就用

begin;
update...
update table set left_value = 4, right_value = 5 where id = 12340;
update...
commit;

但同样的,非常慢。很奇怪,因为当我用几十万的数据填充它时(有插入),它在几秒钟内就完成了。

我目前正试图在将其转移到C++实现之前,在Python中测试其速度(速度慢是在命令行和Python中),但现在这个速度太慢了,我需要找到一个新的解决方案,除非我做错了什么。有什么想法?(将采取开源的替代SQLite的方法,同时也是可移植的)

c++
python
sql
database
sqlite
blackrim
blackrim
发布于 2010-05-15
2 个回答
Doug Currie
Doug Currie
发布于 2010-05-15
已采纳
0 人赞同

table.id 上创建一个索引

create index table_id_index on table(id)
    
哇,这似乎已经成功了。为什么,我在哪里可以读到更多关于它的信息?
关于SQLite3优化器的概述,请见 sqlite.org/optoverview.html
Brian R. Bondy
Brian R. Bondy
发布于 2010-05-15
0 人赞同

除了确保你有一个索引外,你可以检查一下 SQLite优化常见问题 .

使用交易可以给你带来非常大的速度提升,正如你所提到的,你也可以尝试关闭日记。

2.2 PRAGMA同步性

布尔型同步值控制 库是否会等待 是否等待磁盘写入完全写入 之前继续。这个设置 可以不同于 默认的_同步值。 的默认值不同。在典型的使用中,该 库可能会花费大量的时间在 在文件系统上等待。设置 "PRAGMA synchronous=OFF "可以使速度大为提高。 带来重大的速度差异。

2.3 PRAGMA count_changes

当count_changes设置为ON时。 回调函数被调用一次 为每个DELETE、INSERT或UPDATE 操作调用一次回调函数。其参数是