关于sqlite3速度慢的原因解决方法

本文探讨了SQLite3在执行插入操作时速度慢的问题,原因是每次插入都需要访问磁盘。通过使用事务处理批量提交和设置PRAGMA synchronous为OFF启用异步模式,可以显著提高速度。在异步模式下,数据先存于内存,仅在应用程序退出时写入磁盘,从而降低系统崩溃导致的数据丢失风险。了解更多SQLite优化技巧,请参阅相关链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

    rc = sqlite3_exec(db, "begin;", 0,0, &szerrmsg);

    for (...){

    //insert into operate

    }

    rc = sqlite3_exec(db, "commit;", 0, 0,&szerrmsg);

    这样速度提高了近千倍。

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

 

    或者在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查看器读取数据是可以读取的,但用文件管理器浏览数据库磁盘文件其大小没有变化。只有当应用程序退出后(即使强制关闭进程),数据库磁盘文件大小才会改变。所以,这种情况只有当操作系统挂掉了,才会丢失数据。

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

    还有些关于sqlite优化的介绍如:https://www.cnblogs.com/huozhong/p/5973938.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值