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源码分析--源网站的更多相关文章

  1. Flink源码分析 - 源码构建

    原文地址:https://mp.weixin.qq.com/s?__biz=MzU2Njg5Nzk0NQ==&mid=2247483692&idx=1&sn=18cddc1ee ...

  2. Elasticsearch源码分析 - 源码构建

    原文地址:https://mp.weixin.qq.com/s?__biz=MzU2Njg5Nzk0NQ==&mid=2247483694&idx=1&sn=bd03afe5a ...

  3. 鸿蒙内核源码分析(源码结构篇) | 内核每个文件的含义 | 百篇博客分析OpenHarmony源码 | v18.04

    百篇博客系列篇.本篇为: v18.xx 鸿蒙内核源码分析(源码结构篇) | 内核每个文件的含义 | 51.c.h .o 前因后果相关篇为: v08.xx 鸿蒙内核源码分析(总目录) | 百万汉字注解 ...

  4. 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 百篇博客分析OpenHarmony源码 | v13.02

    百篇博客系列篇.本篇为: v13.xx 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 51.c.h .o 几点说明 kernel_liteos_a_note | 中文注解鸿蒙内核 ...

  5. nginx源码分析-源码结构

    本文主要简单介绍nginx源码目录结构.程序编译流程.如何构建学习nginx的环境等.本文以及后续nginx源码分析文章是基于nginx当前(2009-02-27)的稳定版本0.6.35进行的分析,该 ...

  6. Servlet-Cookie源码分析 源码环境:Tomcat8

    最近在学习servlet的一些实现细节,阅读了Cookie的源码. Cookie本质上是服务器发送给客户端(主要是浏览器)的一个会话临时数据. 其源码注释文档的说明: Creates a cookie ...

  7. Spring源码分析——源码分析环境搭建

    1.在Windows上安装Gradle gradle工具类似于maven,用于项目的构建,此处主要用于构建spring源码,以便我们将spring源码导入eclipse. 开发环境 Java:JDK8 ...

  8. kafka C客户端librdkafka producer源码分析

    from:http://www.cnblogs.com/xhcqwl/p/3905412.html kafka C客户端librdkafka producer源码分析 简介 kafka网站上提供了C语 ...

  9. 同网页的WebRTC实现与源码分析

    基本按照Real time communication with WebRTC搭建(下面简称该网站为官方tutorial) 本文重视WebRTC的基于同页面通信的代码实现,主要讲述顺序是WebRTC的 ...

随机推荐

  1. Android Studio(IDEA)快速代码模版使用

    驼峰命名法删除和移动光标快捷键 Android Studio(IDEA)默认没有开启驼峰命名法的删除和移动光标,我们需要设置一下快捷键keymap,按照下面的两张图进行设置 Ctrl+Delete 删 ...

  2. json接口返回值

    SpringBoot响应客户端渲染数据 1.SpringBoot构造并且返回一个json对象 首先,我们在父包下新建一个pojo的包,并新建一个User类  IDEA自动生成对应的get/set,然后 ...

  3. Codeforces Round #308 (Div. 2)

    A. Vanya and Table   Vanya has a table consisting of 100 rows, each row contains 100 cells. The rows ...

  4. Java Cookie工具类

    1.Cookie跨域 Cookie不能跨顶级域名访问,但是二级域名可以共享Cookie,所以要实现跨域,有一定的局限性. 2.代码 package com.DingYu.Cookie; import ...

  5. 汇编语言--微机CPU的指令系统(五)(位操作指令)

    (6) 位操作指令 1.位扫描指令(Bit Scan Instruction) 指令的格式:BSF/BSR Reg, Reg/Mem ;80386+ 受影响的标志位:ZF 位扫描指令是在第二个操作数中 ...

  6. jquery中找到元素在数组中位置,添加或者删除元素的新方法

    一:查找元素在数组中的位置 jQuery.inArray()函数用于在数组中搜索指定的值,并返回其索引值.如果数组中不存在该值,则返回 -1. jQuery.inArray( value, array ...

  7. css优先级计算规则——权重

    一.css的优先级 当对同一个元素设置相同的多个声明时,会按照优先级的高低选择应用哪种声明. <style> #id{ color:red; } p{ color:blue; } < ...

  8. Salesforce 应用生命周期管理

    应用程序生命周期管理 一个Salesforce系统可以有多个版本,最常见的有: production版本:终端用户实际使用的版本 sandbox版本:沙盒环境,用于开发.测试等 在对Salesforc ...

  9. Spring学习之旅(四)Spring工作原理再探

    上篇博文对Spring的工作原理做了个大概的介绍,想看的同学请出门左转.今天详细说几点. (一)Spring IoC容器及其实例化与使用 Spring IoC容器负责Bean的实例化.配置和组装工作有 ...

  10. 34.Odoo产品分析 (四) – 工具板块(5) – 设备及联系人目录(1)

    查看Odoo产品分析系列--目录 设备管理 设备应用用于公司内部的设备管理,跟踪员工的设备及管理维护的要求.  安装"设备"模块:  1 设备 选择设备菜单,并新建一个设备,该表单 ...