当前位置: 首页 > news >正文

小巧玲珑的SQLite

SQLite是桌面端和移动端的不错选择

前言

SQLite身影无处不在。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至今已经有14个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

SQLite的能力

SQLIte数据库最大支持128TiB(140 terabytes, or 128 tebibytes, or 140,000 gigabytes or 128,000 gibibytes).
在7G文件大小下,6千万条记录的有索引某个表中,查询条件如果是索引字段,不管什么位置,查询都不要1ms时间。

案例1

插入:
插入100万行数据的产生数据时间就有100万次for循环。并且表除了主键,没有其它索引。
插入100万行 40s. 每行有19个字段,数据库文件占225M
插入1000万行,1个小时没完成,测试程序卡死。占用内存90%。经过分析,其实1000万行数据在30分钟左右时就插入完毕。可能是内存不足,导致响应特别慢。数据库文件占空间2.5G。由于笔记本内存不足,接下来不再测试1000万行的情况。
插入300万行,122910ms,即123秒,其中产生数据的时间和释放数据内存的时间占了96秒。接着,第二次插入300万行,128910ms,即
129秒。第三次插入300万行,125575ms,即126秒。cpu保持在47%、内存保持在36%,其中数据本身占的内存23%。

查询:
查询性能情况:
查询语句 select * from 表名 where cardid=‘4600331’
未建立索引的情况
1000万行查询1.5秒
建立索引后,1毫秒内
在两个字段上建立索引后,插入数据时间变长。插入300万行,122910ms,即123秒,其中产生数据的时间和释放数据内存的时间占了96秒。
接着,第二次插入300万行,128910ms,即129秒。
第三次插入300万行,290575ms,即290秒。
第四次插入100万行,279031ms,即279秒。
建立索引后1000万行数据占空间2.8G。
更新单行数据133ms。删除单行数据104ms。

注意:建立索引后,插入数据时间倍增。第一次插入300万行约2分钟,接着第二次插入300万行5分钟,第三次约7分钟。

SQLite的使用场景

对于重要程度不是特别高的场合,可以大量使用SQLite库保存历史数据,平时用不到的时候只占硬盘,不占内存。
SQLite 文档还贴心地指出了什么时候用 client/server SQL 数据库(如MySQL):

  • Is the data separated from the application by a network? → choose client/server
  • Many concurrent writers? → choose client/server
  • Big data? → choose client/serverOtherwise → choose SQLite!

sqlcipher

安装:

brew install SQLCipher
pip3 install pysqlcipher3

代码示例

import peewee
from playhouse.sqlcipher_ext import SqlCipherDatabasedb = SqlCipherDatabase('testsqlcipher.db', passphrase=get_good_passphrase())
db_proxy = peewee.Proxy()
db_proxy.initialize(db)class Model(peewee.Model):class Meta:database = db_proxyclass Person(Model):name = peewee.CharField(primary_key=True)age = peewee.IntegerField()def __unicode__(self):return u"{0} (age {1})".format(self.name,self.age)Person.create_table()
Person("alice",17)
Person("bob",23)

常用技巧

两个Sqlite库之间导数据

attach DataBase '/opt/data/my.db' as db2;
INSERT into StockBaseInfo select S.* from db2.StockBaseInfo as S
detach database db2;

相关文章:

小巧玲珑的SQLite

SQLite是桌面端和移动端的不错选择 前言 SQLite身影无处不在。 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低&a…...

【Android 内存优化】 native内存泄漏监控方案源码分析

文章目录 前言使用效果使用apiJNI的动态注册native方法动态注册 hook的实现android_dlopen_ext和dl_iterate_phdr naive监控的实现nativeGetLeakAllocs 总结 前言 Android的native泄漏怎么检测?下面通过研究开源项目KOOM来一探究竟。 使用效果 未触发泄漏前的日志…...

数据结构 二叉树 力扣例题AC——代码以及思路记录

LCR 175. 计算二叉树的深 某公司架构以二叉树形式记录,请返回该公司的层级数。 AC int calculateDepth(struct TreeNode* root) {if (root NULL){return 0;}else{return 1 fmax(calculateDepth(root->left), calculateDepth(root->right));} } 代码思路 …...

Android 11系统启动流程

在Android 11系统启动流程中,系统启动主要经历了以下几个阶段: 引导加载程序(Bootloader)启动: 当设备加电后,首先运行的是ROM Bootloader,它负责验证操作系统映像的完整性、初始化基本硬件并加…...

python 爬取杭州小区挂牌均价

下载chrome驱动 通过chrome浏览器的 设置-帮助-关于Google Chrome 查看你所使用的Chrome版本 驱动可以从这两个地方找: 【推荐】https://storage.googleapis.com/chrome-for-testing-publichttp://npm.taobao.org/mirrors/chromedriver import zipfile import os import r…...

数据可视化-ECharts Html项目实战(3)

在之前的文章中,我们学习了如何创建堆积折线图,饼图以及较难的瀑布图并更改图标标题。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 …...

【理解机器学习算法】之Clustering算法(K-Means)

实现 K-means 聚类从零开始涉及几个关键步骤:初始化质心、将点分配给最近的质心、根据分配更新质心,以及重复这个过程直到收敛。这里是一个基本的 Python 实现: K-means 算法步骤: 初始化质心:从数据点中随机选择 k …...

Transformer的前世今生 day02(神经网络语言模型、词向量)

神经网络语言模型 使用神经网络的方法,去完成语言模型的两个问题,下图为两层感知机的神经网络语言模型: 假设词典V内有五个词:“判断”、“这个”、“词”、“的”、“词性”,且要输出P(w_next | “判断”、“这个”、…...

【Linux】多线程编程基础

💻文章目录 📄前言🌺linux线程基础线程的概念线程的优缺点线程与进程的区别 线程的创建 🌻linux线程冲突概念互斥锁函数介绍加锁的缺点 📓总结 📄前言 无论你是否为程序员,相信多线程这个词汇应…...

【地图】腾讯地图 - InfoWindow 自定义信息窗口内容时,内容 html 嵌套混乱问题

目录 需求描述问题问题代码页面展示 解决原因解决办法解决代码页面展示 代码汇总注 需求描述 腾讯地图上画点位,点击点位展示弹框信息 问题 问题代码 // 打开弹框 openInfoWindow(position, content) {this.infoWindow new TMap.InfoWindow({map: this.map,posit…...

Vue3、element-plus和Vue2、elementUI的一些转换

插槽 Vue3<template #default"scope"></template> <template #footer></template>Vue2<template slot-scope"scope"></template> <template slot"footer"></template>JS定义 Vue3 <script…...

Go语言gin框架中加载html/css/js等静态资源

Gin框架没有内置静态文件服务&#xff0c;但可以使用gin.Static或gin.StaticFS中间件来提供静态文件服务。 效果图如下&#xff1a; 一、gin 框架加载 Html 模板文件的方法 方式1&#xff1a;加载单个或多个html文件&#xff0c;需要指明具体文件名 r.LoadHTMLFiles("vie…...

#鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行

3 月 19 日&#xff0c;#鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行。 现场&#xff0c;深圳市南山区人民政府副区长李志娜发布《2024 年南山区支持鸿蒙原生应用发展首批政策措施清单》&#xff0c;从加强鸿蒙原生应用供给能力、推动鸿蒙原生应用产业集聚、完善鸿蒙原生…...

flask 继续学习

group_by group_by是一种在数据库查询或数据处理中常用的操作&#xff0c;它用于将数据按照指定的列进行分组。通过group_by操作&#xff0c;可以将数据集按照某个列的值进行分类&#xff0c;然后对每个分类进行聚合计算或其他操作。 在SQL语言中&#xff0c;group_by通常与聚…...

DockerFile遇到的坑

CMD 命令的坑 dockerfile 中的 CMD 命令在docker run -it 不会执行 CMD 命令。 FROM golang WORKDIR / COPY . ./All-in-one CMD ["/bin/sh","-c","touch /kkk.txt && ls -la"] RUN echo alias ll"ls -la" > ~/.bashrc(不…...

并网型风光储微电网日前优化调度(MATLAB实现)

考虑了光伏发电、风力发电、电池储能和负荷需求等因素&#xff0c;与主网相连不考虑向主网售电情况。 % 微电网日前优化调度示例代码% 定义时间步长&#xff08;例如&#xff0c;每小时&#xff09; time_steps 24;% 生成模拟数据&#xff1a;光伏发电量&#xff0c;风力发电…...

MATLAB环境下基于振动信号的轴承状态监测和故障诊断

故障预测与健康管理PHM分为故障预测和健康管理与维修两部分&#xff0c;PHM首先借助传感器采集关键零部件的运行状态数据&#xff0c;如振动信号、温度图像、电流电压信号、声音信号及油液分析等&#xff0c;提取设备的运行监测指标&#xff0c;进而实现对设备关键零部件运行状…...

流畅的 Python 第二版(GPT 重译)(十二)

第五部分&#xff1a;元编程 第二十二章&#xff1a;动态属性和属性 属性的关键重要性在于&#xff0c;它们的存在使得将公共数据属性作为类的公共接口的一部分完全安全且确实可取。 Martelli、Ravenscroft 和 Holden&#xff0c;“为什么属性很重要” 在 Python 中&#xff0…...

【Python 48小时速成 2】关键字

文章目录 01. and &#xff1a;逻辑运算符&#xff0c;表示逻辑与操作。02. exec &#xff1a;内置函数&#xff0c;用于执行存储在字符串或文件中的 Python 代码。03. not &#xff1a;逻辑运算符&#xff0c;表示逻辑非操作。04. assert &#xff1a;断言语句&#xff0c;用于…...

小程序socket 全局代码

在微信小程序中&#xff0c;为了实现在整个应用范围内共享一个WebSocket连接&#xff0c;通常会将WebSocket的创建、打开、关闭以及消息收发等功能封装在一个全局模块中&#xff0c;然后在各个需要使用WebSocket功能的页面中引入并调用这个模块的方法。以下是一个简化的全局Web…...

ADG732 32通道模拟多路复用器Arduino驱动详解

1. ADG732 32:1 模拟多路复用器 Arduino 驱动库深度解析ADG732 是 Analog Devices&#xff08;现属 Analog Devices, Inc.&#xff09;推出的高性能 CMOS 单刀三十二掷&#xff08;SP32T&#xff09;模拟开关芯片&#xff0c;专为低导通电阻、低电荷注入和高通道隔离度的精密信…...

PowerShell色彩魔法:利用ANSI转义序列打造个性化终端输出

1. 从黑白到彩色&#xff1a;PowerShell终端的美化革命 记得刚接触编程那会儿&#xff0c;最让我头疼的就是PowerShell那个黑漆漆的窗口。每次调试脚本&#xff0c;满屏的白色文字看得眼睛发酸&#xff0c;关键信息总是淹没在茫茫输出中。直到有一天&#xff0c;我在Linux终端看…...

BG3ModManager完全指南:5步精通博德之门3模组管理

BG3ModManager完全指南&#xff1a;5步精通博德之门3模组管理 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. This is the only official source! 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager BG3ModManager是《博德之门3》社区最受…...

cv_resnet101_face-detection效果实测:高精度人脸定位与多场景适应

cv_resnet101_face-detection效果实测&#xff1a;高精度人脸定位与多场景适应 最近在做一个智能相册管理的项目&#xff0c;需要从海量照片里快速、准确地找出所有人脸。试了好几个开源模型&#xff0c;要么对小脸、侧脸识别不准&#xff0c;要么在光线复杂或者有遮挡的情况下…...

GTE文本向量-large开源模型部署教程:ModelScope离线模型下载+本地路径映射

GTE文本向量-large开源模型部署教程&#xff1a;ModelScope离线模型下载本地路径映射 1. 引言&#xff1a;为什么你需要这个强大的中文文本理解工具&#xff1f; 如果你正在处理中文文本&#xff0c;无论是想从新闻里自动提取关键信息&#xff0c;还是想分析用户评论的情感倾…...

如何快速追溯微博图片来源:Chrome插件终极指南

如何快速追溯微博图片来源&#xff1a;Chrome插件终极指南 【免费下载链接】WeiboImageReverse Chrome 插件&#xff0c;反查微博图片po主 项目地址: https://gitcode.com/gh_mirrors/we/WeiboImageReverse 你是否在微博上看到一张有趣的图片&#xff0c;却不知道它来自…...

豆包水印怎么去除?1分钟教程!视频/图片一键搞定(亲测有效)

现在不少人都在拥抱AI&#xff0c;其中用豆包生成素材&#xff0c;结果有平台的AI水印&#xff1f;先别急着截图裁剪&#xff0c;今天教你一个手机就能用的方法&#xff0c;1分钟去除豆包水印&#xff0c;导出高清高清无水印版的视频或者图片。先说结论最快最稳的方法&#xff…...

JL杰理AC696N开发板常见问题FAQ-问题6:为什么提示“key 不匹配”?杰理的蓝牙芯片的key是什么?以及该如何添加key? 杰理key文件原理?

引言做杰理蓝牙音频系列芯片开发&#xff0c;第一次编译下载时&#xff0c;可能会遇到一个报错提示&#xff1a;“KEY不匹配”。很多新手一脸懵&#xff1a;key是什么&#xff1f;为什么要加&#xff1f;怎么加&#xff1f;其实这是杰理芯片的一套软件授权保护机制。本文以JL杰…...

Kubernetes Operator 框架入门

Kubernetes Operator 框架入门&#xff1a;解锁自动化运维新能力 在云原生时代&#xff0c;Kubernetes已成为容器编排的事实标准&#xff0c;但管理复杂的有状态应用&#xff08;如数据库、消息队列&#xff09;仍面临挑战。Operator框架应运而生&#xff0c;它通过扩展Kubern…...

深度学习环境配置踩坑无数?试试这个镜像,基础环境全搞定,只需关注代码

深度学习环境配置踩坑无数&#xff1f;试试这个镜像&#xff0c;基础环境全搞定&#xff0c;只需关注代码 1. 为什么选择这个深度学习训练镜像 深度学习环境配置一直是让开发者头疼的问题。从CUDA版本冲突到Python包依赖问题&#xff0c;再到各种框架的兼容性问题&#xff0c…...