数据库B树索引的工作原理

什么是B树?

B树是一种数据结构,它按排序顺序在其节点中存储数据。我们可以如下表示样本B树。

样本B树

B树存储数据,使得每个节点按升序包含密钥。这些键中的每一个都有两个对另外两个子节点的引用。Te左侧子节点键小于当前键,右侧子节点键多于当前键。如果单个节点具有“n”个键,则它可以具有最大“n + 1”个子节点。

为什么索引在数据库中使用?

想象一下,您需要在文件中存储一个数字列表,并在该列表中搜索给定的数字。最简单的解决方案是将数据存储在数组中,并在新值到来时附加值。但是,如果需要检查数组中是否存在给定值,则需要逐个搜索所有数组元素并检查给定值是否存在。如果你足够幸运,你可以在第一个元素中找到给定的值。在最坏的情况下,该值可以是数组中的最后一个元素。我们可以将这种最坏的情况表示为渐近符号中的O(n)。这意味着如果您的数组大小最多为“n”,则需要执行“n”次搜索才能在数组中查找给定值。

你怎么能改善这个时间?最简单的解决方案是对数组进行排序并使用二进制搜索来查找值。每当您向数组中插入一个值时,它应该保持顺序。通过从数组中间选择一个值来搜索。然后将所选值与搜索值进行比较。如果所选值大于搜索值,则忽略数组的左侧并搜索右侧的值,反之亦然。

二进制搜索

在这里,我们尝试从数组3,6,8,11,15和18中搜索键15,它已经按排序顺序搜索。如果进行普通搜索,则由于元素位于第五位,因此需要五个单位的时间进行搜索。但在二进制搜索中,只需要三次搜索。

如果我们将这个二进制搜索应用于数组中的所有元素,那么它将如下所示。

扫描二维码关注公众号,回复: 4850191 查看本文章

二进制搜索所有元素

看起来熟悉?它是一棵二叉树。这是B树的最简单形式。对于二叉树,我们可以使用指针而不是将数据保存在已排序的数组中。在数学上,我们可以证明二叉树的最坏情况搜索时间是O(log(n))。二叉树的概念可以扩展为更通用的形式,称为B树。B-tree不是为单个节点提供单个条目,而是为单个节点使用条目数组,并为每个条目引用子节点。以下是每种预先描述的方法的一些时间复杂度比较。

类型

插入

删除

抬头

未排序的数组

O(1)

上)

上)

排序数组

上)

上)

O(日志(N))

B树

O(日志(N))

O(日志(N))

O(日志(N))

B +树是另一种用于存储数据的数据结构,它看起来与B树几乎相同。B +树的唯一区别是它将数据存储在叶节点上。这意味着所有非叶节点值再次在叶节点中重复。下面是一个B +树样本。

B +树

在叶节点中再次重复13,30,9,11,16和38个非叶值。你能看到叶子节点上这棵树的特色吗?

是的,叶节点包括所有值,所有记录都按排序顺序排列。在B +树的专业中,您可以执行与B树相同的搜索,此外,如果我们将指针指向每个叶节点,您可以遍历叶节点中的所有值,如下所示。

B +树与叶节点引用

B +树与叶节点引用

如何在数据库中使用索引?

当B-tree进入数据库索引时,这个数据结构变得有点复杂,不仅有一个键,还有一个与键相关的值。该值是对实际数据记录的引用。密钥和值一起称为有效负载。

假设以下三列表需要存储在数据库中。

名称

标记

年龄

28

亚历克斯

32

45

汤姆

37

23

罗恩

87

13

标记

20

48

短发

89

32

首先,数据库为每个给定记录创建唯一的随机索引(或主键),并将相关行转换为字节流。然后,它将每个密钥存储在B +树上并记录字节流。这里,随机索引用作索引的关键。密钥和记录字节流完全称为有效负载。得到的B +树可以表示如下。

数据库页面上的B +树

在这里,您可以看到所有记录都存储在B +树的叶节点中,索引用作创建B +树的关键字。没有记录存储在非叶节点上。每个叶节点都引用树中的下一个记录。数据库可以通过使用索引或顺序搜索来执行二进制搜索,方法是仅通过遍历叶节点搜索每个元素。

如果未使用索引,则数据库将读取每个记录以查找给定记录。启用索引时,数据库会为表中的每个列创建三个B树,如下所示。这里的关键是用于索引的B树密钥。索引是对实际数据记录的引用。

首先使用索引时,数据库会根据B-tree搜索给定的密钥,并在O(log(n))时间内获取索引。然后,它通过在O(log(n))时间内使用已经找到的索引在B +树中执行另一次搜索并获取记录。

B-tree和B +树中的每个节点都存储在Pages内。页面大小固定。页面从一个开始有一个唯一的编号。页面可以使用页码对另一页面的引用。在页面的开头,存储页面元细节,例如最右边的子页面编号,第一个空闲单元格偏移量和第一个单元格偏移量。数据库中可以有两种类型的页面:

  1. 索引页面:这些页面仅存储索引和对另一页面的引用。

  2. 存储记录的页面:这些页面存储实际数据,页面应该是叶子页面。

使用SQLite B树索引

创建B树索引的基本语法如下

CREATE  INDEX  index_name  ON  table_name ;


SQLite中使用的索引方法有三种,如下所示。

1.单列索引

这里,索引是基于一个表列创建的。只为索引创建了一个Btree。语法如下。

CREATE  INDEX  index_name  ON  table_name(column_name);

 

2.独特的指数

不允许唯一索引存储使用索引的列的重复值。语法可以写成如下。

table_name(column_name)上创建UNIQUE  INDEX  index_name  ; 

 

3.综合指数

 这种类型的索引可以有多个索引。对于每个索引列,都存在Btree。以下是复合索引的语法

 table_name 上的CREATE INDEX  index_name (column1,column2); 

 

结论

数据库应该有一种有效的方式来存储,读取和修改数据。B树提供了插入和读取数据的有效方法。在实际的数据库实现中,数据库同时使用B树和B +树来存储数据。用于索引的B树和用于存储实际记录的B +树。除了二进制搜索之外,B +树还提供顺序搜索功能,这使数据库能够更好地控制数据库中的非索引值。

猜你喜欢

转载自blog.csdn.net/Tybyqi/article/details/86159313