SQLite内部机制和新特性

SQLite内部机制和新特性

一、B-tree和Pager模块

B-tree为SQLite VDBE提供了O(logN)级时间复杂度的插入和查询,通过双向遍历记录实现O(1)级时间复杂度的删除。B-tree是自平衡的,能够对碎片清理和内存再分配进行自动管理。B-tree对如何读写磁盘没有限定,只是关注页之间的关系。

B-tree在需要一个页或修改一个页的时候会通知Pager。修改页时,如果使用传统的回滚日志,pager首先将原始页复制到日志文件,同样,pager在B-tree完成操作时收到通知,并基于所处的事务状态决定如何处理。

1.数据库文件格式
数据库中所有的页都是以1开始编号的。一个数据库是由多个B-tree组成的-每张表以及每个索引各对应一个B-tree(表使用B+tree,索引使用B-tree)。数据库中每张表或索引都以根页作为第一页。所有的索引和表都存储在sqlite_master表中。

数据库的第一页比较特殊,第一页的前100B包含了头文件,用于说明数据库文件,它包含了:库版本、模式版本、页大小、编码方式、是否启用自动清理等所有需要创建数据库所需的数据库持久性设置以及通过编译指示设置的其他参数。

  1. 页重用及清理
    SQLite使用空闲链表回收页,当一个页上的所有记录都被删除时,该页将会被存回到空闲页链表中预留重用。之后如果再添加新信息,最近被回收的页将会被选中,以避免创建新页(创建新页会增加数据库大小)。运行VACUUM命令可以释放空闲链表中的页来减小数据库的大小。实际上VACUUM命令是重新建立了新的数据库并将旧的数据复制到此,在这过程中忽略空闲链表中的页。如果启动数据库自动清理功能,SQLite将不会使用空闲页链表,而是在每个提交行为时自动进行数据库收缩处理。

  2. B-tree记录
    B-tree中的一系列页是由B-tree记录组成,这些记录也称为有效载荷。这些记录并非我们所说的数据库中的记录,而是更为原始的格式。一个B-tree记录由两个原始的域组成:键值域和数据域。键值域是每个数据库表中所包含的ROWID值或主键值;在B-tree中,数据域可以包含任意类型的内容。最终我们所说的数据库记录存储在数据域中。

    B-tree用来保持记录有序并方便记录的2查询,同时,键值域能够完成B-tree的主要工作(定位下一个记录是由B+tree完成的)。此外,记录的大小是可变的,这取决于内部的键值域和数据域的大小。一般而言每个页都拥有多个有效载荷。如果有效载荷超出了一个页,则会出现跨页的情况(blob记录)。

  3. B+tree
    B-tree记录按键值存储。所有的键值在一个B-tree中必须是唯一的,表使用B+tree定义在内部页中。不包含表数据。B+tree的根页面和内部节点页面都用于搜索导航,这些页的数据域指向下一层页,这些页只包含键值。所有数据库记录都存储在叶子页中,在叶子页层,记录和页按记录序排列,以便B-tree游标能够遍历记录。无论是前访还是后访,只需要用叶子页就可以使得在O(1)时间复杂度下遍历记录成为可能。下图是B+tree的组织结构图:

  4. 记录和域
    叶子页的数据域中的数据库记录由VDBE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值