在对sqlite3 insert into 等操作时速度比较慢。

    原因是因为它每次插入数据都需要访问一次磁盘,打开磁盘的速度大家可想而知,如果对数据库进行大量的操作,那么速度回很慢。

    解决办法用事务的形式提交:因为我们开始事务后,进行的大量操作的语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也就只用打开一次。

    在进行大量的操作前使用如下语句:

rc = sqlite3_exec(db, "begin;", 0,0, &szerrmsg);
    for (...){
    //insert into operate
    }
    rc = sqlite3_exec(db, "commit;", 0, 0,&szerrmsg);

    这样速度提高了近千倍。

    看看执行结果,一条插入语句大概要100ms左右:

executemany数据库写入慢 数据库写入数据慢_数据库

 

    或者在open数据库后面加上异步设置。

sqlite3_exec(db,"PRAGMA synchronous = OFF; ",0,0,0);

 

    如下一段描述模式的介绍:

PRAGMA synchronous;
    PRAGMA synchronous = FULL;(2)
    PRAGMA synchronous = NORMAL;(1)
    PRAGMA synchronous = OFF;(0)

    查询或设置 synchronous 标志。 第一种格式返回一个整数,当 synchronous 为 FULL (2) 时, SQLite 数据库引擎将会在重要的时刻暂停, 以保证在继续运行之前数据确实已经写到磁盘上去了。 这能保证在遇到操作系统崩溃可电源故障时, 重新启动机器数据库文件不会被破坏。FULL 同步方式是非常安全的, 但也是很慢的。若 synchronous 设为 NORMAL,则 SQLite 数据库引擎将在大多数重要时刻暂停,但比在 FULL 模式要少。 在极少情况下,处理这种模式的数据库文件可能会由于“不是时候” 的电源故障而导致受损。但在实际应用中, 更有可有遭受到灾难性的磁盘故障或其它无法恢复的硬件故障。 若将 synchronous 设为 OFF (0),那么 SQLite 从操作系统取得数据后将会立即进行处理而不会暂停。 如果使用 SQLite 的应用程序崩溃,数据将是安全的。 但如果在数据写入磁盘之前,操作系统死机或机器断电, 数据库文件可能会损坏。此外,在该模式下, 某些操作会比其它情况下快 50 倍。

 

    实际上异步模式下数据库是用文件内存映射的方式实现的,没直接写入磁盘,但可以在操作系统上的进程间共享数据,即我在应用程序里面写数据库,然后我马上用SQLite Developer查看器读取数据是可以读取的,但用文件管理器浏览数据库磁盘文件其大小没有变化。只有当应用程序退出后(即使强制关闭进程),数据库磁盘文件大小才会改变。所以,这种情况只有当操作系统挂掉了,才会丢失数据。

    试想,能否写个定时把内存文件的数据定时刷新存储到磁盘中,这样减少系统崩溃而引发丢失数据的风险?我想应该是可以的吧。