SQLite优化实践

1. 启用写入批处理

  • 使用事务将多条插入操作包装在一起,这样可以减少磁盘I/O和日志的写入。
sql 复制代码
BEGIN TRANSACTION;
-- 执行多个INSERT语句
COMMIT;

通过将多个插入操作包装在一个事务中,可以显著减少每次写入数据库时的磁盘I/O操作。

2. 使用更大的页大小

  • 在SQLite中,可以通过修改PRAGMA page_size来优化性能。默认情况下,SQLite的页面大小为4096字节,但在某些情况下,增大页面大小(如到8192或16384字节)可以减少磁盘I/O。
sql 复制代码
PRAGMA page_size = 8192;

3. 启用自动VACUUM

  • 启用 PRAGMA auto_vacuum = 1 会在删除数据后自动回收空间,虽然它会有一些性能影响,但可以防止数据库文件膨胀。在数据插入密集的场景中,可以选择禁用这个选项来提高性能(如果不需要频繁清理数据库中的空间)。
sql 复制代码
PRAGMA auto_vacuum = 0;  -- 禁用自动清理

4. 启用WAL(Write-Ahead Logging)模式

  • 默认情况下,SQLite使用滚动日志(Rollback Journal)来记录事务,这会在每次事务时创建额外的磁盘写入。WAL模式会使得写入更加高效,减少磁盘I/O,并能提高并发读写的性能。
sql 复制代码
PRAGMA journal_mode = WAL;

5. 禁用同步操作

  • SQLite默认会使用PRAGMA synchronous = FULL,即每次写入都会等待磁盘确认。通过设置为PRAGMA synchronous = NORMAL,可以减少磁盘的同步操作,从而提高性能。
sql 复制代码
PRAGMA synchronous = NORMAL;

6. 使用合适的索引

  • 索引对查询性能有帮助,但在插入数据时,索引会带来额外的开销。如果对插入性能要求较高,可以暂时禁用索引,插入数据后再创建索引。
sql 复制代码
-- 禁用索引
PRAGMA foreign_keys = OFF;
-- 插入数据
-- 启用索引
PRAGMA foreign_keys = ON;

7. 考虑分表

  • 如果某些表非常大,可能想要考虑将数据分表。例如,可以按时间或者某个字段将数据分散到多个表中,这样可以减少单个表的写入压力。

8. 调整合适的内存设置

  • 使用较大的内存缓存,可以减少磁盘I/O,特别是在大批量插入时。可以通过设置PRAGMA cache_size来增加缓存大小。
sql 复制代码
PRAGMA cache_size = 10000;  -- 增加缓存大小

9. 关闭自动提交

  • 默认情况下,SQLite会在每个插入操作后进行自动提交,这会导致每次插入时都进行磁盘写入。可以将其禁用,并手动进行事务提交,确保多个插入操作合并为一个。
sql 复制代码
PRAGMA automatic_index = OFF;

10. 调优内存池

  • SQLite有一个内存池,它会缓存数据库文件的多个页面。通过合理调节内存池的大小,可以在需要大量写入时提高性能。
sql 复制代码
PRAGMA temp_store = MEMORY;

最终建议的配置:

sql 复制代码
PRAGMA page_size = 8192;
PRAGMA auto_vacuum = 0;
PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL;
PRAGMA cache_size = 10000;
PRAGMA temp_store = MEMORY;
BEGIN TRANSACTION;
-- 执行批量插入操作
COMMIT;

减少磁盘I/O、提高插入速度,并在牺牲一些内存和CPU使用的情况下优化数据库性能。

相关推荐
人工智能教学实践2 天前
Flask-SQLAlchemy 操作 SQLite 数据库示例
数据库·sqlite·flask
gys98953 天前
uniapp使用sqlite模块
数据库·sqlite·uni-app
wudl55663 天前
Python 虚拟环境和包管理
数据库·python·sqlite
我菜就多练3 天前
SQlite3
数据库·sqlite
天天进步20154 天前
Django vs Flask:2025年该如何选择Python Web框架?
数据库·sqlite
Python私教4 天前
基于 Django 5 + DRF 构建博客系统后端接口(从建模到接口实现)
python·django·sqlite
pop_xiaoli4 天前
SQLite3语句以及FMDB数据存储初步学习
学习·ios·sqlite·objective-c·cocoa
rexling14 天前
【玩转全栈】----Django基本配置和介绍
数据库·django·sqlite
l1t5 天前
在Lua用luasql-sqlite3库访问SQLite数据库
数据库·git·sqlite·lua
qqxhb5 天前
系统架构设计师备考第61天——嵌入式系统架构模式&操作系统&数据库&中间件
数据库·中间件·系统架构·sqlite·dds·层次化(封闭/开放)·递归模式