我正在尝试使用sqlite(sqlite3)来存储数十万条记录(想要sqlite,所以程序的用户不必运行[my] sql server)。
我必须更新数十万条记录,有时输入左边的值(它们是分层的),但是已经找到了标准
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的开源替代方案)
答案 0 :(得分:12)
在table.id
create index table_id_index on table(id)
答案 1 :(得分:3)
除了确保您有索引之外,您还可以查看SQLite Optimization FAQ。
如您所述,使用交易可以为您带来非常大的速度提升,您也可以尝试关闭日记功能。
示例1:
2.2 PRAGMA同步
布尔同步值控件 图书馆是否会等待 用于完全写入磁盘写入 磁盘继续之前。这个设置 可以不同于 从中加载的default_synchronous值 数据库。在典型的使用中 图书馆可能会花很多时间 等待文件系统。设置 “PRAGMA synchronous = OFF”可以制作一个 主要的速度差异。
示例2:
2.3 PRAGMA count_changes
当count_changes设置为ON时, 回调函数被调用一次 对于每个DELETE,INSERT或UPDATE 操作。参数是数字 已更改的行数。如果你 不要使用此功能,有一个 转动这个小的速度增加 关闭。