SQLite采用的是B+树来存储表中的索引和数据。 
B树的键及其值既存储在内部节点上,也存储在叶节点上,所有的叶节点具有相同的深度。 
B+树作了些微改变,键和数据会存储到叶节点上,并且按照键值排好序。而内部节点只存储键值。相当于有两条查找路径。

SQLite从根叶开始创建B+树,一般从页1开始。它以独立的页来存储树节点,每页一个节点,这些页要分内部页还是叶子页。对于每个节点,任何项(数据)及其键值组合成一个payload, 每页都会预设一个payload值,当实际的payload超过此值时,超出的字节就会填充到溢出页,多余的payload会依次存储到溢出页形成的链表里。内部页和叶子页都可以有溢出页。

SQLite的页结构: 
SQLite数据库文件是由固定大小的页组成的。 也就是说该文件大小肯定是页大小的整数倍。其中的B+树模块管理着所有的页。每一个页,要么是普通页(内部页或者叶子页),要么是溢出页,要么是自由页。

1. 页结构: 
主要有4部分, 页头(内部页12字节,叶子页只要8字节), 单元指针数组,单元内容区,未分配空间区 
页头构成: 
起始地址: 
0 (1字节), Flags. 1: intkey, 2: zerodata, 4: leafdata, 8: leaf 
1 (2字节), 第一个自由块的起始位移 
3 (2字节), 该页的单元数 
5 (2字节), 单元内容区的第一个字节的位移 
7 (1字节), 自由区的字节数 
8 (4字节), 右孩子节点的地址(Ptr(n)), 对叶子节点,该值被忽略

对于第一个字节来说,是一个标志值,如果leaf为true, 表明它是叶子节点。如果zerodata为true,  表明该页只存储key值,不存储数据,如果intkey为true, 表明这里的key是一个整数,会存储到单元的头,而不是放到payload区。

Cell(单元)会存到页里最末尾的高地址区域里,它们会向页的开始方向增长。单元指针数组从页头末尾的第一个字节开始。每个指针是一个2字节的偏移地址(从页头开始)。 这些指针都是按照键值排好序的。

经过随机的insert, delete操作之后,页中的单元和空闲空间会变得分散。在单元内容区里的可用空间会被收集成自由块链表,以地址升序排列。该链表的头指针会从页头, 偏移值为1开始,每个自由块最少4字节大小。头4个字节存储着控制信息。头2个字节指向下一个自由块的偏移(值为0,意味着没有下一个自由块),后两个字节表示本自由块的空间大小。一个页中所有碎片(可用字节)大小,会记录在页头的第7字节处。最大255。任何连续只有3个或更少字节的空间将被忽略。当碎片达到最大值之前,碎片会被合并。 
单元内容区的第1个字节会在页头的第5个节处进行记录。该值充当内容区域和未分配空间的边界。

单元: 
4字节,  左孩子的页号, 如果leaf flag设置为true,则忽略。 
var (1-9), 数据字节数,如果zerodata为true,则忽略。 
var (1-9), 键字节数,或者是键本身(如intkey为true) 
* payload 
4 ,   溢出链的第1页,没有溢出则忽略。

SQLite指南(0) 表和索引的文件存储结构相关推荐

  1. Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构

    Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构 1. 索引的分类1 1.1. 索引的类型  按查找方式分,两种,分块索引 vs编号索引1 1.2. 按索引与数据的查找顺序可分为 正 ...

  2. 查看数据库、表、索引的物理存储情况

    在管理.维护数据库时,经常需要查看数据库文件.日志文件所占用的磁盘空间,以及磁盘还剩下的磁盘空间,你可以通过下面几种方面 查看数据库文件详细情况: 1: 是通过远程连接(或VPN)连接到数据库服务器, ...

  3. 教程:12、文件存储结构

    大部分的Linux文件系统(如ext2.ext3)规定,一个文件由目录项.inode和数据块组成: 目录项:包括文件名和inode节点号. Inode:又称文件索引节点,包含文件的基础信息以及数据块的 ...

  4. Linux文件存储结构,包括目录项、inode、数据块

    2019独角兽企业重金招聘Python工程师标准>>> 先说inode 理解inode,要从文件储存说起.文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sec ...

  5. 《嵌入式 – GD32开发实战指南》第20章 GD32的存储结构

    开发环境: MDK:Keil 5.30 开发板:GD32F207I-EVAL MCU:GD32F207IK 20.1 GD32存储结构的工作原理 20.1.1 Cortex-M内核的存储器映射 存储器 ...

  6. linux文件存储结构,Linux文件存储方式以及软硬链接

    在Linux中,文件包括常规文件.目录.符号链接等.为了方便理解,在本文中,文件指常规文件,目录指常规目录. 文件 1. 文件是如何存储的? 文件是由3部分组成 的: 文件名: dentry 文件元数 ...

  7. Revit API 开发(12): Revit 文件存储结构

    整理(很多内容非原创,转载自网络) 链接来自 The Building Coder: Open Revit OLE Storage RVT File Version RVT and RFA Thumb ...

  8. git服务器文件存储结构,在远程服务器搭建gitlab,并将数据单独存储到磁盘

    虽然github目前是全球最火的分布式代码托管平台,但是github有一个缺点就是,project如果想要建为private,那就得付费.还有data存储在github平台,而不是自己的本地服务器.相 ...

  9. 5.15 mysql 数据库(数据库/表操作/索引/pymysql/备份与恢复/事务/锁) 学习笔记

    文章目录 1 初始数据库 1)数据库 2)mysql 3)和用户权限相关的 4)基本操作 2 表操作 1)存储引擎 2)表和数据的一些基本操作 3)mysql中的数据类型 4)表的完整性约束 5)修改 ...

最新文章

  1. EBS   常见的AD命令
  2. 流媒体传输协议---RTP--基础
  3. Android研究-linux内核启动到android系统
  4. Python二分查找算法
  5. kickstart命令选项
  6. java 生成 tar.gz_一文教您如何通过 Java 压缩文件,打包一个 tar.gz Filebeat 采集器包...
  7. Bash脚本教程之脚本入门
  8. 音频服务器未显示,Win7系统没有声音提示“一个或多个音频服务未运行”如何解决...
  9. 收获,不止SQL优化——抓住SQL的本质--第七章
  10. css3 shapes是什么意思,CSS Shapes有哪些让人兴奋之处
  11. Servlet的面试题
  12. 数码照片像素与可冲印照片尺寸对照表
  13. 电脑各个硬件的理论知识 经典
  14. Latex输入分段函数
  15. 视频音轨音量是否为0检测过程
  16. googleMap 谷歌地图
  17. java 123456转换成abcdef_java 数字与字母的转换 (转)
  18. Unity3d插件分享之Assetbundle工具2021最好用工具没有之一
  19. 【数分书单】分析思维《一本小小的蓝色逻辑书》第四章小结
  20. vim编辑器显示字体颜色

热门文章

  1. java下linux和window通用的获取指定网段的本地ip地址(NetworkInterface)
  2. java(14) - HashMap类
  3. 通过JDBC和Hibernate对Clob和Blob的操作
  4. BZOJ 1015 [JSOI2008]星球大战starwar (逆序并查集)
  5. 水滴状的自己定义视图,让您摆脱单调的Dialog
  6. Tabs Outliner(标签系统)
  7. Cognos 增加全局类
  8. Redis的RDB AOF DATABASE
  9. BCS冬奥主题活动日:奥运网络安全成全球关注焦点
  10. 谷歌开源文件访问漏洞审计工具 PathAuditor(详解)