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 小时前
鸿蒙NEXT中SQLite数据库全面实战指南
数据库·sqlite·harmonyos
Mr_Xuhhh6 小时前
项目-sqlite类的实现
java·jvm·sqlite
ggabb1 天前
家庭劳务机器人发展阶段与时间预测
sqlite
cellurw1 天前
day40 SQLite3单词查询程序设计与实现
sqlite
小马学嵌入式~2 天前
嵌入式 SQLite 数据库开发笔记
linux·c语言·数据库·笔记·sql·学习·sqlite
言之。2 天前
Django REST Framework 中 @action 装饰器详解
数据库·sqlite
yddddddy2 天前
SQLite的基本操作
数据库·sqlite
cellurw2 天前
Day39 SQLite数据库操作与HTML核心API及页面构建
数据库·sqlite·html
言之。2 天前
Django高效查询:values_list实战详解
django·sqlite·list
程序员如山石2 天前
sqlite3的加解密全过程
sqlite