如何解决sqlite3上的瓶颈?

Ped*_*ves 4 sqlite

我正在开发一个用 C 编写的项目,该项目生成近 350k 的序列并保存在 sqlite 数据库中。对于每个序列,我必须在表中插入(或忽略)一个字符串,并更新其他表中的一行。

我尝试了这个“指南”,但无法达到每秒超​​过 30k 操作。

我正在使用每个 1M 操作的事务(插入和更新)并且 PRAGMA synchronous=OFF

我有什么选择来解决这个瓶颈?

med*_*ina 5

实际上,SQLite 在普通台式计算机上每秒可以轻松执行 50,000 条或更多 INSERT 语句。但它每秒只能进行几十笔交易。交易速度受到磁盘驱动器转速的限制。一个事务通常需要磁盘盘片完整旋转两次,这在 7200RPM 磁盘驱动器上限制为每秒大约 60 个事务。

事务速度受到磁盘驱动器速度的限制,因为(默认情况下)SQLite 实际上会等到数据真正安全地存储在磁盘表面上才完成事务。这样,如果您突然断电或操作系统崩溃,您的数据仍然安全。有关详细信息,请阅读 SQLite 中的原子提交。

默认情况下,每个 INSERT 语句都是其自己的事务。但是,如果您用 BEGIN...COMMIT 包围多个 INSERT 语句,则所有插入都会分组到单个事务中。提交事务所需的时间分摊到所有包含的插入语句上,因此每个插入语句的时间大大减少。

另一个选项是运行 PRAGMA synchronous=OFF。该命令将导致 SQLite 不等待数据到达磁盘表面,这将使写入操作显得更快。但是,如果您在事务过程中断电,您的数据库文件可能会损坏。

请查看此常见问题解答,它解释了插入瓶颈问题等。