「这是我参与11月更文挑战的第 7 天,活动详情查看:2021最后一次更文挑战」
深入一点...
在SQLite上的查询要经过一个特定的组件链,以便与实际数据进行交互。
SQLite被设计成一个模块化的架构。该架构由七个主要组件组成,分为两个部分。
- 前端解析系统
- 后台引擎
前端编译SQL语句,后端执行编译后的语句。
前端
正如我提到的,前端预处理SQL语句和SQLite命令,然后作为输入发送。它解析语句(和命令),并对其进行优化,正如我之前提到的,生成等价的SQLite内部字节码,以便后端可以执行。
- Tokenizer(词法分析)
负责通过对输入进行词法分析,将输入的SQL语句分割成独立的token
- Parser
负责通过词法分析产生的token来分析SQL语句的结构,并从token中生成一个解析树
- Code Generator
它遍历解析树并生成字节码,当被后端执行时,应该能够产生SQL语句的结果
后端
后端引擎,它接收由前端生成的字节码并执行它。这个引擎执行实际的数据库处理工作,它由4个模块组成:虚拟机、B-Tree、Pager和操作系统接口。
- Virtual Machine
虚拟机接收由前端生成的字节码并执行它。它是数据库中数据的最终执行者。它把数据库看作是表和索引的集合,这些表和索引实际上是以一种叫做B-Tree的数据结构来存储的。虚拟机本质上是一个关于字节码指令类型的大 switch 语句。还是说像其他?我们拭目以待。。。
- B-Tree
负责将数据实际组织成一个有序的树状数据结构。每个表和索引都有自己的B-Tree。这种结构的使用有助于虚拟机搜索、插入、删除和更新树状数据。它还可以帮助虚拟机在需要时创建或删除新的树。总之:是底层数据组织的形态。
- Pager
B-Tree会以固定大小的页面从磁盘上请求信息。默认的page_size是4096字节(Linux parge_size→4KB) ,但也可以是512到65536字节之间的任何2次方。
Pager模块负责读取、写入和缓存这些页面。 页面缓存还提供回滚和原子提交的抽象,并负责数据库文件的锁定,实现事务的ACID。B-Tree驱动从Pager请求特定的页面,并在它想修改页面或提交或回滚变化时通知Pager。Pager处理底层的细节,确保请求得到快速、安全和有效的处理。这个模块是个不小的挑战。
- Operating System Interface
这个模块负责为不同的操作系统提供一个统一的接口。它实现了文件I/O、线程互斥、睡眠、时间、随机数生成等功能。虽然是支持不同的OS,但是在一开始不会。