Btree 索引

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

m-way查找树

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

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

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

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

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

Btree查找树

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

主要特点如下,

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

Btree的查找

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

Btree的插入

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

详细插入操作可参考: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都存在叶子节点中

为什么使用Btree结构

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

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

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

红黑树

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


本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012

时间: 2024-08-22 16:12:33

Btree 索引的相关文章

高性能的MySQL(5)创建高性能的索引一B-Tree索引

一.索引的类型 MySQL中,索引是在存储引擎层实现的,而不是服务器层,所以没有统一的标准. MySQL支持的索引类型如下: 1.B-Tree索引(也包括B+Tree索引,统称为B-Tree索引,只是数据结构上的不同,特性上是一样的) 使用B-Tree数据结构来存储数据,实际上很有存储引擎使用的是B+Tree.关于BTree.B-Tree.B+Tree的区别请看本博客的附件. InnoDB就是使用的B+Tree索引. B-Tree通常意味着所有的值都是按顺序存储的,并且每一个叶子页到跟的距离相同

Oracle B-Tree索引与Bitmap索引的锁代价的比较

环境: SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production PL/SQL Release 11.2.0.1.0 - Production CORE  11.2.0.1.0  

深入浅出PostgreSQL B-Tree索引结构

PostgreSQL B-Tree是一种变种(high-concurrency B-tree management algorithm),算法详情请参考src/backend/access/nbtree/README PostgreSQL 的B-Tree索引页分为几种类别 meta page root page # btpo_flags=2 branch page # btpo_flags=0 leaf page # btpo_flags=1 如果即是leaf又是root则 btpo_flags

MySQL的btree索引和hash索引的区别

hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引.       可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢?任何事物都是有两面性的,Hash 索引也一样,虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊

mysql hash 索引 vs B-TREE 索引

Terry Tsang //我相信最有价值的东西,是很多人都应该因为它而一起学习和进步的!真正有价值的技术,都是值得和所有人分享的! hash 索引 当前 memory 引擎, innodb 引擎支持 hash 索引, 索引将存放内存中. (innodb 存放 buffer pool) innodb 启动 innodb-adaptive-hash-index 参数就能够支持 假设利用  show engine innodb status \G 看到大量类似下图的等待值 (参见 RW-latch

bitmap 索引和 B-tree 索引在使用中如何选择_oracle

现在,我们知道优化器如何对这些技术做出反应,清楚地说明 bitmap 索引和 B-tree 索引各自的最好应用. 在 GENDER 列适当地带一个 bitmap 索引,在 SAL 列上创建另外一个位图索引,然后执行一些查询.在这些列上,用 B-tree 索引重新执行查询. 从 TEST_NORMAL 表,查询工资为如下的男员工: 1000 1500 2000 2500 3000 3500 4000 4500 因此: SQL> select * from test_normal 2 where s

pageinspect分析btree索引结构

pg的btree索引有4中类型的索引页面:1.meta page,每个索引都会有该页面,这个页面直接指向root page.2.root page页面,如果heap item很多,会指向新的branch page或者是leaf page.3.branch page页面指向branch page或者leaf page.4.leaf page.我在9.4.7的版本上8kblock的int类型字段上的索引,大概一个页面可以存407条记录,也就是说,如果你是int索引且只有一个字段记录数在0-407范围

mysql hash 索引 vs B-TREE 索引 理解

hash 索引 当前 memory 引擎, innodb 引擎支持 hash 索引, 索引将存放内存中,(innodb 存放 buffer pool)  innodb 启动 innodb-adaptive-hash-index 参数就能够支持   假设利用  show engine innodb status \G 看到大量类似下图的等待值 (参见 RW-latch 由 brt0sea.c 产生)   建议你使用 skip-innodb_adaptive_hash_index 关闭 innodb

[数据库]MySQL Hash索引和B-Tree索引的区别

MySQL Hash索引和B-Tree索引的区别究竟在哪里呢?相信很多人都有这样的疑问,下文对两者的区别进行了详细的分析,供您参考. MySQL Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引.  可 能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索

B-Tree索引在sqlserver和mysql中的应用

在谈论数据库性能优化的时候,通常都会提到"索引",但很多人其实没有真正理解索引,并没有搞清楚索引为什么能加快检索速度,以至于在实践中并不能很好的应用索引. 事实上,索引可以说是最廉价而且十分有效一种优化手段,一般而言,设计优良的索引对查询性能优化确实能起到立竿见影的效果. 相信很多读者,都了解和使用过索引,可能也看过或者听过"新华字典"."图书馆"之类比较通俗描述,但是对索引的存储结构和本质任然还比较迷茫. 有数据结构和算法基础的读者,应该都听过