原文链接 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 命令进行设置的