高性能SQLite的选项

时间:2011-09-28 12:25:51

标签: performance sqlite embedded

我正在开发一个嵌入式系统,它需要非常频繁地存储和检索数据。我期待每秒可能有100次写入和10次读取。数据将以突发而非连续的方式到达。

我想使用SQLite来存储所有这些数据,但由于它是一个flash文件系统,因此写入(INSERTS& UPDATES)太慢了。我尝试设置synchronous = off,这确实提高了性能,但我对破坏数据库感到紧张。

在我的应用程序中,电源故障将是一种罕见但实际可能性。我可以忍受失去一些最近的数据,但绝对不会因为数据库损坏而丢失所有数据。

我还考虑过使用内存中的SQLite数据库作为主数据库,并定期将其同步到文件系统,如Synchronizing sqlite database from memory to file

中所述。

我还应该考虑其他选择吗?

2 个答案:

答案 0 :(得分:5)

当数据突发到来时,请务必在一次交易中进行一系列插入和更新。

sqlite3_exec(handle, "BEGIN TRANSACTION", NULL, NULL, NULL);

for ( ... ) {
    // Do your inserts/updates
}

sqlite3_exec(handle, "END TRANSACTION", NULL, NULL, NULL);

默认情况下,SQLite将每个插入/更新放在自己的事务中。如果底层文件系统很慢,这可能会使SQLite相当慢。通过声明自己的事务,您可以显着减少对文件系统执行的实际写入量,从而大大提高SQLite的性能。

答案 1 :(得分:1)

我不知道您的数据集有多大,但如果它们不是太大,那么WAL模式可能有所帮助。您可以试用"PRAGMA synchronous=1":此设置在每次交易后都不会同步,但偶尔会同步。 (默认:写入2 MB的新数据时。)SQLite文档说您可能会丢失一些最近的事务,但数据库不会被破坏。