Skip to content

学习SQLite

Posted on:February 13, 2022 at 06:51 PM

简介

SQLite 是一个轻量级的关系型数据库,运算速度快,占用资源少,很适合在移动设备上使用, 不仅支持标准 SQL 语法,还遵循 ACID(数据库事务)原则,无需账号,使用起来非常方便!

SQLite 的存储类型有五类,分别是 NULLINTEGERREALTEXTBLOB。SQLite 支持列的亲和类型概念,即任何列仍然可以存储任何类型的数据。

sqlite体系结构图

数据存储(存储位置、存储形式)

SQLite 通过文件来保存数据库在本地,一个文件就是一个数据库,数据库中又包含多个表格,表格里又有多条记录,每个记录由多个字段构成,每个字段有对应的,每个值我们可以指定类型,也可以不指定类型(主键除外)。

数据结构和组织

SQLite 的一个 DB 对应一个物理文件,文件中的数据被分成若干个大小相等的 Page 进行存储,这些 Page 之间的关系由树形结构来组织管理。SQLite 以 B+树(B+tree)的数据结构形式存储在磁盘上,最大支持 2TB 的数据库。

B/B+树 广泛应用于文件系统及数据库中,如:

SQLite3数据库总体结构

SQLite3数据库表的B+树结构

SQLite数据库页面结构

注:以上三张图来自朱清华的论文《基于Android手机SQLite的取证系统设计实现》

数据索引 (如何找到数据)

索引介绍

数据库的索引跟字典目录的概念是一致的。索引本质上是一个指向数据库中的数据的指针。索引是有序的,因而可以对其执行二分查找。

索引有助于加快 SELECT 查询和 WHERE 子句,但会减慢使用 UPDATEINSERT 语句时的数据输入。索引可以创建或者删除,但不会影响数据。

上面提及到,SQLite 底层是使用 B+树来存储数据的,B+树的结构特点就是:非叶子节点仅具有索引作用,所有的数据均存放在叶子节点中。每一个叶子节点都带有指向下一个节点的指针,形成了一个有序链表。

B+树示例

比如需要查询元素 3:

第一次磁盘IO

第二次磁盘IO

第三次磁盘IO

索引的优点:

索引的缺点:

索引语句

数据的更新和查询

SQLite 只提供了表级锁,在并发、多线程操作上存在局限性。 SQLite 支持使用 SQL 语言来进行更新和查询。

SQL 语句

数据的备份和冗余 (防止丢失和保持可用)

SQLite 可以直接备份数据库文件来进行全量备份(手动操作,恢复的时候进行数据库文件替换即可)。

sqlite> .backup 'backup.db'
sqlite> .restore 'backup.db'

数据一致性, 事务

事务是对一个数据库执行工作单元。你可以把许多的 SQLite 查询联合成一组,把这些放在一起作为事务的一部分进行执行。

事务保障了关系数据库的一致性,事务的准则是:要么全部成功,要么全部失败。

当发出 begin 命令时,事务将持续到调用 commit 或 rollback,或者 sql 命令引起约束违反进而导致 rollback。 一般情况下,锁持续时间隐藏在事务持续时间内,他们总是一起结束。下图可以看到事务的声明周期和锁状态

SQLite锁状态

事务的控制主要有三条命令:

事务控制命令只与 DML 命令 INSERT、UPDATE 和 DELETE 一起使用。他们不能在创建表或删除表时使用,因为这些操作在数据库中是自动提交的。

事务详解

数据管理

数据分析

和 PostgreSQL 非常相似,SQLite 中的 ANALYZE 命令也同样用于分析数据表和索引中的数据,并将统计结果存放于 SQLite 的内部系统表中,以便于查询优化器可以根据分析后的统计数据选择最优的查询执行路径,从而提高整个查询的效率。见如下示例:

数据管理工具

DataGrip Navicat

参考链接

开放源码嵌入式数据库 SQLite 简介

菜鸟教程

SQLite 使用总结

SQLite 源码分析

SQLite 学习手册