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

相关推荐
从零数据分析3 小时前
零基础学SQL 23:和上月比总对不上?LAG/LEAD 一步取出上一次(附 4 个模板)
java·数据库·sql·mysql·oracle·sqlite·database
ycydynq7 小时前
django利用不涉及数据库form自定义表单 表单元素验证
数据库·django·sqlite
专注仿真1 天前
从「能跑通」到「能交付」:一套可直接落地的电商用户行为分析平台(Python + SQLite/MySQL + Streamlit 全栈源码与部署文档)
python·mysql·sqlite
用户0510122572961 天前
SQLite 学习博客(一):从零建库,理解 SQLite 的角色与第一张表
数据库·sqlite
姜鱼问生2 天前
Kuma SQLite 备份坑
数据库·sqlite
橙光成长3 天前
Context Mode 深度解析:用沙盒、SQLite 与钩子路由,把 AI 编码 Agent 的上下文消耗削减 98%
数据库·人工智能·sqlite
阿星_3 天前
Linux Ubuntu 查看 SQLite 工具
linux·ubuntu·sqlite
jiushidt4 天前
在 DBeaver 中为 SQLite 启用 SpatiaLite
数据库·sqlite
小马不起床4 天前
Django 后端实战指南_14:门店、省份、用户门店关系查询接口
数据库·django·sqlite
下页、再停留4 天前
【C#桌面客户端系列学习-14】SQLite数据库之增删改查完整示例
数据库·sqlite