SQLite优化实践

news2025/3/28 8:03:26

1. 启用写入批处理

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

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

2. 使用更大的页大小

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

3. 启用自动VACUUM

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

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

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

5. 禁用同步操作

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

6. 使用合适的索引

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

7. 考虑分表

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

8. 调整合适的内存设置

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

9. 关闭自动提交

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

10. 调优内存池

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

最终建议的配置:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java8循环解压zip文件---实现Excel文件数据追加

java8循环追加Excel数据 实际遇到问题:定期获取zip文件,zip文件内有几个固定模板的Excel文件,有的Excel文件可能还包含多个sheet。 有段时间一次性获取到好几个zip包,需要将这些包都解压,并且按照不同的文件名、sheet进…

基于SpringBoot的电影售票系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

SQL Server 2022 安装问题

一、安装与配置问题 1. SQL Server 2022 安装失败怎么办? 常见原因: 硬件或操作系统不满足最低要求(如内存、磁盘空间不足)。未关闭防火墙或杀毒软件。之前版本的 SQL Server 残留文件未清理。 解决方案: 确保硬件配…

MySQL 8.0.41安装教程(附安装包)mysql8.0.41图文详细安装教程

文章目录 前言一、MySQL 8.0.41下载安装包二、MySQL 8.0.41安装教程1.启动安装程序2.选择安装模式3.选定安装组件4.确认安装设置5.执行安装操作6.安装进行中7.设置数据库密码8.继续点击下一步9.执行配置操作10.完成配置11. 再次点击下一步12.结束安装向导 三、MySQL 8.0.41配置…

深入解析 C++20 中的 std::bind_front:高效函数绑定与参数前置

文章目录 1. 什么是 std::bind_front?2. 使用 std::bind_front2.1 基本用法2.2 绑定多个参数 3. 优势与特点3.1 简化代码3.2 支持可调用对象3.3 支持完美转发 4. 实际应用场景4.1 事件处理4.2 算法通用化4.3 成员函数调用 5. 总结 在现代 C 编程中,函数绑…

python裁剪nc文件数据

问题描述: 若干个nc文件储存全球的1850-2014年月尺度的mrro数据(或其他数据),从1850-1到2014-12一共1980个月,要提取出最后35年1980.1~2014.12年也就是420个月的数据。 代码实现 def aaa(input_file,output_file,bianliang,start_index,en…

CSS网格布局Grid

目录 一、Grid 网格布局 1.Grid 布局基础 2.网格容器属性 3.网格项目属性 4.高级功能 5.典型应用场景 6.最佳实践 二、Flex和Grid对比 示例: 一、Grid 网格布局 CSS Grid 是一种强大的二维布局系统,能够以行和列的方式精确控制网页布局。它比传…

医院挂号预约小程序|基于微信小程序的医院挂号预约系统设计与实现(源码+数据库+文档)

医院挂号预约小程序 目录 基于微信小程序的医院挂号预约系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、小程序用户端 2、系统服务端 (1) 用户管理 (2)医院管理 (3)医生管理 &#xf…

蓝桥杯第十届 特别的数

题目描述 小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。 请问,在 1 到 n 中,所有这样的数的…

Qt开发:QInputDialog的使用

文章目录 一、QInputDialog的介绍二、 QInputDialog的基本用法三、使用 QInputDialog的实例四、QInputDialog的信号与槽 一、QInputDialog的介绍 QInputDialog 是 Qt 提供的一个对话框类,用于获取用户输入的文本、整数或浮点数。它提供了简单易用的静态方法和可定制…

redis--JavaSpring客户端

目录 一、引言 二、配置 三、相关操作 四、总结 一、引言 本篇文章会将redis与spring项目进行结合,看看再spring项目中,redis是如何使用的 二、配置 三、相关操作 四、总结 在spring项目中的使用和在基础项目上的使用有差异,但是差异并不大…

2、二分和贪心

一、二分 这里有个小技巧,你会发现,只要是求最大最小最多等等的贪心过程,我们就有3种方法:①二分②贪心算法③动态规划 我们先讲二分和贪心,动态规划比较麻烦,留到后期。 1、了解 2、模版 class Solution …

QuecPython 网络协议之TCP/UDP协议最祥解析

概述 IP 地址与域名 IP 地址是网络中的主机地址,用于两台网络主机能够互相找到彼此,这也是网络通信能够成功进行的基础。IP 地址一般以点分十进制的字符串来表示,如192.168.1.1。 ​ 我们日常访问的网站,其所在的服务器主机都有…

ISIS-2 邻居建立关系

上一章我们介绍了ISIS的基础概念以及报文内容和作用在什么样的场景下面的 这一章我们来介绍IS-IS的邻居建立关系 一、概念 IS-IS中路由器的角色可分为L1、L2、L1/2这三种类型其中的L1/L2有点类似与我们OSPF中的ABR IS-IS中的邻居关系分为L1与L2邻居关系,其中所有建立L2邻居关…

Nature Machine Intelligence 嵌入式大语言模型使机器人能够在不可预测的环境中完成复杂的任务

近期英国爱丁堡大学发表Nature Machine Intelligence研究工作,提出了一种名为ELLMER(具身大型语言模型支持机器人)的创新框架,通过整合大型语言模型(如GPT-4)、检索增强生成(RAG)、视…

Springboot整合elasticsearch详解 封装模版 仓库方法 如何在linux里安装elasticsearch

目录 版本 下载地址 ElasticSearch频繁报503错误 开放 9300 和 9200 两个端口 测试联通性 改动包装类 elasticsearchTemplate getAllRespRepository 封装elasticsearchService 业务逻辑 版本 首先要对应版本 这是我在官网找到的版本信息 一定要 springboot 和 es 相…

【矩阵快速幂】P6601 「EZEC-2」机器|普及+

本文涉及知识点 【矩阵快速幂】封装类及测试用例及样例 P6601 「EZEC-2」机器 题目背景 tlx 喜欢科幻小说。 小宇宙中只剩下漂流瓶和生态球。漂流瓶隐没于黑暗里,在一千米见方的宇宙中,只有生态球里的小太阳发出一点光芒。在这个小小的生命世界中,几只清澈的水球在零重力环…

FPGA助力智能机器人应用

今年开年AI机器人引爆科技圈,都说FPGA是“万能芯”,在AI方向上已经挣扎了几年,仍旧不能“破圈”,那么在机器人方向呢? 个人观点我是不太看好目前FPGA能在机器人方面能“破圈”,但是一切皆有可能&#xff0c…

如何在jupyter notebook中使用django框架

(最好以管理员身份进入,否则在安装某些内容时会报错) 一.创建一个名为new_env虚拟环境 输入以下指令创建名为new_env的虚拟环境: conda create -n new_env python3.8 回车,出现以下内容,输入y确认安装,等待安装完毕…