Btree 索引

心已赠人 2023-10-17 15:54 356阅读 0赞

索引是帮助数据库高效获取数据的一种数据结构,通过提取句子主干,就可以得到索引的本质。

m-way查找树

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

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

  • 每个节点存储的key数量小于m个
  • 每个节点的度小于等于m
  • 节点key按顺序排序
  • 子树key值要完全小于、大于或介于父节点之间

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

  1. 待索引元素列表为:
  2. [5, 7, 12, 6, 8, 3, 4]

452899-20160322234906026-2143578428.png

Btree查找树

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

主要特点如下,

  • 每个节点的key数量小于m个(与m-way相同)
  • 除根节点和叶子节点的其他节点存储key的个数必须大于等于m/2
  • 所有叶子节点都处于同一层,也就是说所有叶节点具有相同的深度h(树的高度,也意味着树是平衡的)

Btree的查找

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

Btree的插入

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

452899-20160322234949104-1929841866.png

详细插入操作可参考:http://www.cnblogs.com/yangecnu/p/introduce-b-tree-and-b-plus-tree.html

B+tree查找树

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

  • 非叶子节点的key个数等于m
  • 每个节点的下级指针为n个(n为关键字个数,而不是n+1个)
  • 为所有叶子节点增加一个链指针(注意链上的数据是有序的)
  • 所有key都存在叶子节点中

452899-20160322235030636-1382897103.png

为什么使用Btree结构

索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。
索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。(换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。)

为了达到降低磁盘I/O的目的

  • 磁盘按需读取,要求每次都会预读的长度一般为页的整数倍, 数据库系统将一个节点的大小设为等于一个页,这样每个节点的元素数据只需要一次I/O就可以完全载入
  • 每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O
  • 把B-tree中的m值设的非常大,就会让树的高度降低,有利于一次完全载入

红黑树

红黑树BST的时间复杂度是依赖于树的高度,但是,红黑树的高度与Btree相比,高度更大。

来源:http://www.cnblogs.com/coder2012/p/5309197.html

发表评论

表情:
评论列表 (有 0 条评论,356人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Btree 索引

    > 索引是帮助数据库高效获取数据的一种数据结构,通过提取句子主干,就可以得到索引的本质。 m-way查找树 如果想了解`Btree`,需要首先了解`m-way`数据结构

    相关 MySQL的BTREE索引和HASH索引

    为什么要用索引? 使用索引后减少了存储引擎需要扫描的数据量,加快查询速度 索引可以把随机I/O变为顺序I/O 索引可以帮助我们对所搜结果进行排序以避免使用磁

    相关 oracle-btree和bitmap索引

    在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。  对于数据库来说

    相关 Btree索引,Hash索引

    1.什么是Btree索引,Hash索引 备注:在MySQL文档里,实际上是把B+树索引写成了BTREE 在MySQL里常用的索引数据结构有B+树索引和哈希索引两种。