高效更新SQLite表的多个记录
我正在尝试在一个项目中使用sqlite(sqlite3)来存储成千上万的记录(我希望使用sqlite,这样程序的用户就不需要运行一个[my]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;
包围起来,但速度还是很慢。奇怪的是,当我用插入的方式填充几十万条记录时,几秒钟就完成了。
我目前正在尝试在python中测试速度(慢的情况出现在命令行和python中),然后再转到C++实现,但现在这个速度实在太慢了,我需要找到一个新方案,除非我做错了什么。有什么想法吗?(我也愿意接受可移植的开源替代方案)
2 个回答
3
除了确保你有索引之外,你还可以查看一下SQLite优化常见问题。
使用事务可以大大提高速度,正如你提到的,你还可以尝试关闭日志记录。
示例 1:
2.2 PRAGMA synchronous
这个“synchronous”设置控制着库在继续执行之前,是否要等到数据完全写入磁盘。这个设置可能和数据库加载的默认值不同。在正常使用中,库可能会花很多时间在等待文件系统。把“PRAGMA synchronous=OFF”设置成关闭,可以显著提高速度。
示例 2:
2.3 PRAGMA count_changes
当“count_changes”设置为开启时,每次进行删除、插入或更新操作时,回调函数都会被调用一次。传入的参数是被改变的行数。如果你不使用这个功能,关闭它可以稍微提高速度。
13
在 table.id
上创建一个索引
create index table_id_index on table(id)