数据库

索引原理-BTree讲解

2018-04-25  本文已影响108人  lbcBoy

一.索引定义

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

索引提供指向存储所在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。

当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。这就是索引的目的,提高查询效率。

二.索引的分类

索引有两类:btree和hash;
两种索引的区别,详见****;
这里我们主要教BTree索引。

三.索引的原理

如果想了解Btree,需要首先了解m-way数据结构。

3.1.m-way查找树

m-way查找树是是一种树形的存储结构,主要特点如下:

例如:3-way如图,m为3,那么每个节点最多拥有为2个(m-1)

待索引元素列表为:[5, 7, 12, 6, 8, 3, 4]
m-way.png

3.2.BTree

Btree是一种平衡的m-way查找树,它可以利用多个分支节点(子树节点)来减少查询数据时所经历的节点数,从而达到节省存取时间的目的。m称为B-Tree的度。

B 树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。

特点
Btree的查找

必须从根节点开始采用二分法查找,所以时间复杂度为O(logn)。

Btree的插入

为了保证树的平衡,如果带插入节点的key数量小于m-1个,则直接插入(不会违反第一条特性),否则,需要将该节点分为两部分,再执行该操作。

下面是往B树中依次插入:6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4
Btree插入过程.gif

3.3.B+Tree

B+tree是基于Btree的变体,与Btree不同之处在于:

3.4.区别与优点:

四.B-树和B+树的效率分析

4.1.磁盘IO与预读
4.2.BTree例子
B+树.png

B-树和B+树查找过程基本一致。如上图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。


感谢网友的分享:
http://www.cnblogs.com/coder2012/p/5309197.html
https://www.kancloud.cn/kancloud/theory-of-mysql-index/41844
http://www.cnblogs.com/yangecnu/p/introduce-b-tree-and-b-plus-tree.html
http://hongyitong.github.io/2017/01/05/%E7%B4%A2%E5%BC%95%E5%8E%9F%E7%90%86%E5%8F%8AB%E6%A0%91%E7%B4%A2%E5%BC%95/

上一篇 下一篇

猜你喜欢

热点阅读