SQlite源码分析--源网站
http://huili.github.io/B-treeImplementation/hierarchicalorganization.html
SQLite中的B-tree
SQLite中每个数据库完全存储在单个磁盘文件中,因为B树进行数据的查找、删除、添加速度快,所以这些数据以B树数据结构的形式存储在磁盘上(实现代码在btree.c源文件中)。INGRES那样的DBMS,也用树结构(如B树)来实现存储,以支持借助于多级目录结构的按关键字存取。B树的典型结构如图2所示。B+树是应文件系统所需而出的一种B-树的变型树。B+树可以进行两种查找算法,第一种,从最小关键字起顺序查找;第二种,从根结点开始,进行随机查找。B-tree应用到数据库的每个表和索引中。所有B-tree存储在相同的磁盘文件中。
B-tree为SQLiteVDBE提供O(㏒N)级时间复杂度的查询和插入,通过遍历记录实现O(1)级时间复杂度的删除。B-tree是自平衡的,并能够对碎片清理和内存再分配进行自动管理。B-tree对如何读写磁盘没有限定,只是关注页之间的关系。 B-tree的职责就是排序,它维护着多个页之间错综复杂的关系,这些关系能够保证快速定位并找到一切有联系的数据。B-tree将页面组织成树状结构,这些组织结构很适合搜索,页面就是树的叶子。Pager帮助B-tree管理页面,它负责传输。B-tree是为查询而高度优化了的。它使用特殊的算法来预测将来要使用哪些页,从而让B-tree保存该页面以便尽可能快地工作。 数据库中所有的页都是以1开始顺序编号的。一个数据库是由多个B-tree组成的——每张表以及每个索引各对应一个B-tree。数据库中每张表或索引都以根页面作为第一页。所有的索引和表的根页面都存储在sqlite_master表中。 B-tree中的页由一系列B-tree记录组成,这些记录也称为有效载荷。这些记录不是传统的数据库记录(表中有多个列的那种格式),而是更为原始的格式。一个B-tree记录(有效载荷)仅由两个域组成:键值域和数据域。键值域是每个数据库表中所包含的ROWID值或主键值;在B-tree中,数据域可以包含任意类型的内容。最终,数据库的记录信息存储在数据域中。B-tree用来保持记录有序并方便记录的查询,同时,键值域能够完成B-tree的主要工作。此外,记录(有效载荷)的大小是可变的,这取决于内部键值域和数据域的大小。一般而言,每个页拥有多个有效载荷,但如果一个页的有效载荷超出了一个页的大小,将会出现跨越多个页的情况(包括blob类型的记录)。 B-tree记录按键值顺序存储。所有的键值在一个B-tree中必须唯一(由于键值对应于rowid主键,主键具有唯一性)。表使用B+tree定义在内部页中,不包含表数据(数据库记录)。图3为B+tree表示一个表的实例。
B+tree的根页面和内部结点页都用于搜索导航。这些页中的数据域均指向下一层页,这些页只包含键值。所有的数据库记录都存储在叶子页中,在叶子页层,记录和页按键值顺序排列,以便B-tree游标能够遍历记录(水平遍历)。
SQlite源码分析--源网站的更多相关文章
- Flink源码分析 - 源码构建
原文地址:https://mp.weixin.qq.com/s?__biz=MzU2Njg5Nzk0NQ==&mid=2247483692&idx=1&sn=18cddc1ee ...
- Elasticsearch源码分析 - 源码构建
原文地址:https://mp.weixin.qq.com/s?__biz=MzU2Njg5Nzk0NQ==&mid=2247483694&idx=1&sn=bd03afe5a ...
- 鸿蒙内核源码分析(源码结构篇) | 内核每个文件的含义 | 百篇博客分析OpenHarmony源码 | v18.04
百篇博客系列篇.本篇为: v18.xx 鸿蒙内核源码分析(源码结构篇) | 内核每个文件的含义 | 51.c.h .o 前因后果相关篇为: v08.xx 鸿蒙内核源码分析(总目录) | 百万汉字注解 ...
- 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 百篇博客分析OpenHarmony源码 | v13.02
百篇博客系列篇.本篇为: v13.xx 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 51.c.h .o 几点说明 kernel_liteos_a_note | 中文注解鸿蒙内核 ...
- nginx源码分析-源码结构
本文主要简单介绍nginx源码目录结构.程序编译流程.如何构建学习nginx的环境等.本文以及后续nginx源码分析文章是基于nginx当前(2009-02-27)的稳定版本0.6.35进行的分析,该 ...
- Servlet-Cookie源码分析 源码环境:Tomcat8
最近在学习servlet的一些实现细节,阅读了Cookie的源码. Cookie本质上是服务器发送给客户端(主要是浏览器)的一个会话临时数据. 其源码注释文档的说明: Creates a cookie ...
- Spring源码分析——源码分析环境搭建
1.在Windows上安装Gradle gradle工具类似于maven,用于项目的构建,此处主要用于构建spring源码,以便我们将spring源码导入eclipse. 开发环境 Java:JDK8 ...
- kafka C客户端librdkafka producer源码分析
from:http://www.cnblogs.com/xhcqwl/p/3905412.html kafka C客户端librdkafka producer源码分析 简介 kafka网站上提供了C语 ...
- 同网页的WebRTC实现与源码分析
基本按照Real time communication with WebRTC搭建(下面简称该网站为官方tutorial) 本文重视WebRTC的基于同页面通信的代码实现,主要讲述顺序是WebRTC的 ...
随机推荐
- nginx代理配置 配置中的静态资源配置,root 和 alias的区别。启动注意事项
这篇主要内容是:nginx代理配置 配置中的静态资源配置,root 和 alias的区别.启动注意事项! 为什么会在window上配置了nginx呢?最近我们的项目是静态资源单独放在一个工程里面,后端 ...
- Netty实战九之单元测试
ChannelHandler是Netty应用程序的关键元素,所以彻底地测试他们应该是你的开发过程的一个标准部分.最佳实践要求你的测试不仅要能够证明你的实现是正确的,而且还要能够很容易地隔离那些因修改代 ...
- WPF Modern UI 主题更换原理
WPF Modern UI 主题更换原理 一 . 如何更换主题? 二 . 代码分析 代码路径 : FirstFloor.ModernUI.App / Content / SettingsAppeara ...
- 汇编语言--微机CPU的指令系统(五)(循环指令)
(8)循环指令 循环结构是程序的三大结构之一.为了方便构成循环结构,汇编语言提供了多种循环指令,这些循环指令的循环次数都是保存在计数器CX或ECX中.除了CX或ECX可以决定循环是否结束外,有的循环指 ...
- java 反射模式
反射模式优化工厂类大量switch分支问题 继续上一篇工厂模式的案例,上一篇只有两个算法类(加法和减法),现在再加一个乘法 第一步: //运算类 public class Operation { pr ...
- SQLite: sql script demo
如果有成熟的架构,如何根据数据库关系的表.视图等,进行代码生成架构?减少写代码的时间? -- 考虑主键外键 -- create database geovindu; use geovindu; --2 ...
- [HTML/CSS]导航栏的下划线跟随效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- CSS网页中导入特殊字体@font-face属性详解
@font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中. 语法规则 首先我们一起来看看@font-face的语法规则: @font-face { font-fami ...
- vue+webpack 安装常见插件
html-webpack-plugin 插件地址:https://www.npmjs.com/package...安装指令: npm install html-webpack-plugin --sav ...
- cf1139D. Steps to One(dp)
题意 题目链接 从\([1, M]\)中随机选数,问使得所有数gcd=1的期望步数 Sol 一个很显然的思路是设\(f[i]\)表示当前数为\(i\),期望的操作轮数,转移的时候直接枚举gcd \(f ...