当前位置: 首页 > 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;

相关文章:

  • Java中的类与对象
  • 笔试总结01
  • 深度学习基础知识概述
  • 【算法】差分、前缀和(重新排序)
  • 外包干了3天,技术明显进步。。。。。
  • Mac玩《幻兽帕鲁》为什么打不开D3DMetal?d3d错误怎么办 d3dxl error
  • 前端结合 react axios 获取真实下载、上传进度
  • Vue3学习日记 Day4 —— pnpm,Eslint
  • 【C++】vector容器初步模拟
  • python初始化二维数据
  • 实体框架EF(Entity Framework)简介
  • linux之shell脚本基础
  • DEYOv2: Rank Feature with Greedy Matchingfor End-to-End Object Detection
  • 无线局域网——wlan
  • 【Python 48小时速成 8】函数
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • C# 免费离线人脸识别 2.0 Demo
  • Codepen 每日精选(2018-3-25)
  • CSS 专业技巧
  • CSS居中完全指南——构建CSS居中决策树
  • C语言笔记(第一章:C语言编程)
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • mongodb--安装和初步使用教程
  • Python实现BT种子转化为磁力链接【实战】
  • Spring-boot 启动时碰到的错误
  • webpack+react项目初体验——记录我的webpack环境配置
  • XForms - 更强大的Form
  • 阿里云前端周刊 - 第 26 期
  • 聊一聊前端的监控
  • 前言-如何学习区块链
  •  一套莫尔斯电报听写、翻译系统
  • 用 Swift 编写面向协议的视图
  • 源码安装memcached和php memcache扩展
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • $(selector).each()和$.each()的区别
  • (libusb) usb口自动刷新
  • (Oracle)SQL优化技巧(一):分页查询
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (独孤九剑)--文件系统
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)visual stdio 书签功能介绍
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET企业级应用架构设计系列之开场白
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .NET运行机制
  • @Builder用法
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • []error LNK2001: unresolved external symbol _m
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算