(转) Sqlite3读写性能的优化

声明:内容源自网络,版权归原作者所有。若有侵权请在网页聊天中联系我

原文链接 https://blog.csdn.net/Ango_/article/details/122074816 ,2022年左右,稍微旧了一点,但值得参考学习。

sqlite3是一个广泛应用于小场景的数据库,并发性差一点,但便携性很好。

优化方式

关闭写同步,PRAGMA synchronous = OFF,在 sqlite3 中 synchronous 有三种模式,分别是 FULL,NORMAL 和 OFF,在系统意外终止的时候,安全性逐级减弱,FULL模式下,保证数据不会损坏,安全性最高,写入速度也最慢。OFF 模式会比 FULL 模式快50倍以上。
使用事务,如果有许多数据需要插入数据库,逐条插入,导致频繁的提交以及磁盘IO,使用事务机制,可以批量插入数据,可以极大的提升写入速度。实际测试中的情况是,开启事务之后,写入速度也可以提升近50倍。
执行准备,执行准备相当于将sql语句提前编译,省去每次执行sql语句时候的语法检查等操作,可以极大的优化sql语句的执行效率,其原理有点像 LuaJit 将 Lua 语言成静态机器码,提高运行速度。实测情况中,使用执行准备可以提升40倍的写入速度。
内存模式,sqlite3 支持内存模式,将数据库直接创建到内存中,打开地址传入”:memory:”即可,内存模式相比正常模式,可以省区IO的时间,使用内存模式的加速思路是,先将数据库创建到内存中,数据写入完整之后,再调用 “VACUUM INTO ‘out.db3’;” 语句将其写入到磁盘,在开启了执行准备的情况下,这种方式会稍微快上一点点。

效率对比

优化方法 无优化 关闭写同步 开启事务 执行准备 内存模式
每秒插入 13条 1321条 5万条 213万条 215万条

原文: https://www.cnblogs.com/failymao/archive/2023/03/09/17197166.html

避免锁库

使用 WAL 模式

使用 SQLite3 的 WAL(Write-Ahead Logging)模式可以显著降低锁库的概率。在 WAL 模式下,读操作不会阻塞写操作,写操作也不会阻塞读操作,因此可以实现高并发的读写操作。
可以在 Gorm 中使用以下代码开启 WAL 模式:

import "gorm.io/driver/sqlite"
 db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{
     DSN: "mode=wal",
 })
 
 // 上面这种参数设置方式已经不适用新的设置方法如下
 if Inst, err = gorm.Open(sqlite.Open(dsn), gormConfig); err == nil {
             // 启用 WAL 模式
             _ = Inst.Exec("PRAGMA journal_mode=WAL;")
             //_ = Inst.Exec("PRAGMA journal_size_limit=104857600;")
           //_ = Inst.Exec("PRAGMA busy_timeout=999999;")
 }

使用缓存
使用缓存可以减少对数据库的读操作,从而减少锁库的概率。可以使用第三方缓存库(如 Redis)来实现缓存功能。

增加数据库连接数
增加数据库连接数可以提高数据库的并发处理能力,减少锁库的概率。可以在 Gorm 中使用以下代码来增加数据库连接数:

import "gorm.io/driver/sqlite"
 
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
 
sqlDB, dbError := db.DB()
if dbError != nil {
    return nil, fmt.Errorf("failed to create sqlDB")
}
 
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)
 
// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)'

sqlite优化 PRAGMA 命令 https://www.cnblogs.com/manmanblogs/p/17540073.html

sqlite的优化是通过 PRAGMA 命令进行设置的

相关文章