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使用的情况下优化数据库性能。

相关推荐
老哥不老10 小时前
Python调用SQLite及pandas相关API详解
python·sqlite·pandas
百锦再15 小时前
MK米客方德SD NAND:无人机存储的高效解决方案
人工智能·python·django·sqlite·android studio·无人机·数据库开发
可喜~可乐1 天前
C# SQLite高级功能示例
数据库·sql·sqlite·c#
A~taoker2 天前
django扩展练习记录
数据库·django·sqlite
努力的搬砖人.2 天前
SQLite 转换为 MySQL 数据库
数据库·mysql·sqlite
前进的程序员2 天前
SQLite 数据库常见问题及解决方法
数据库·sqlite
BuLingLings2 天前
vue3+flask+sqlite前后端项目实战
python·sqlite·flask
今天阳光明媚吗4 天前
SQlite数据库
数据库·sqlite
kingwebo'sZone4 天前
Error parsing column 10 (YingShou=-99.5 - Double) dapper sqlite
数据库·sqlite
larance7 天前
Django rest_framework 信号机制生成并使用token
数据库·django·sqlite