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相比,高度更大。

Btree 索引的更多相关文章

  1. 0103MySQL中的B-tree索引 USINGWHERE和USING INDEX同时出现

    转自博客http://www.amogoo.com/article/4 前提1,为了与时俱进,文中数据库环境为MySQL5.6版本2,为了通用,更为了避免造数据的痛苦,文中所涉及表.数据,均来自于My ...

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

    在谈论数据库性能优化的时候,通常都会提到“索引”,但很多人其实并没有真正理解索引,也没有搞清楚索引为什么就能加快检索速度,以至于在实践中并不能很好的应用索引.事实上,索引是一种廉价而且十分有效的优化手 ...

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

    Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...

  4. MySQL索引类型 btree索引和hash索引的区别

    来源一 Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 ...

  5. 14的路 MySQL的btree索引和hash索引的区别

    http://www.cnblogs.com/vicenteforever/articles/1789613.html ash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tr ...

  6. Hash索引和BTree索引区别

    (1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询. 由于 Hash 索引比较的是进行 Hash ...

  7. oracle中的B-TREE索引

    在字段值情况不同的条件下测试B-TREE索引效率 清空共享池和数据缓冲区alter system flush shared_pool;alter system flush buffer_cache; ...

  8. 数据库索引------B-Tree 索引和 Hash 索引的对比

    对于 B-tree 和 hash 数据结构的理解能够有助于预测不同存储引擎下使用不同索引的查询性能的差异,尤其是那些允许你选择 B-tree 或者 hash 索引的内存存储引擎. B-Tree 索引的 ...

  9. Oracle索引之Btree索引

    索引介绍 日常开发中,对于数据的查询如果需要优化,常听说要加个索引.但是为什么加了索引,数据的查询就快了呢?那是不是加了索引就一定会是有效或者有利的呢? Oracle中常见有BTREE索引,位图索引和 ...

随机推荐

  1. 整理几种在axure里使页面居中的方法

    1. 用动态面板固定浏览器功能. 很简单方便. 但缺点是 当浏览器窗口大小小于页面时, 由于会强制居中,导致页面2边是在显示范围外并且是无法通过滚动条滚动的(滚动条是没有的). 2. 使用页面属性里的 ...

  2. ecplise + hadoop 调试环境搭建

    1.需要安装包 1.1 hadoop源码包(hadoop-2.5.2-src.tar.gz) 1.2 hadoop 2X插件(hadoop2x-eclipse-plugin-master.zip) 1 ...

  3. Redis——学习之路三(初识redis config配置)

    我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息.     ...

  4. iOS APP性能优化

    :应用启动时间 应用启动时,只加载启动相关的资源和必须在启动时加载的资源. :本地图片加载方式 本地图片加载常用方法有两种: a. [UIImage imageNamed:@"xx.png& ...

  5. Github fork同步

    做到以下几个步骤: 添加远程上游工程repository. git remote add upstream git@github.com:*.git git remote -v 将上游工程代码合并到本 ...

  6. SOAPUI使用教程-REST功能测试

    当创造了SoapUI功能测试用例,常见的情况是,你调用一些REST资源和验证其响应检查返回正确的结果.这可以容易地实现: 添加一个REST请求到新的test step或现有的TestCase 添加断言 ...

  7. 在CentOS下利用Python+selenium获取腾讯首页的今日话题。

    1.安装依赖包 yum install wget firefox gcc zlib zlib-devel Xvfb 2.安装setuptools 官网地址:https://pypi.python.or ...

  8. tornado学习笔记11 Web应用中模板(Template)使用应用实践

    上一篇中(Web应用中模板的工作流程分析),已经分析了模板的渲染流程,以及相关参数获取及设置原理.这篇主要讲述模板在实际应用案例. 11.1 需求 根据用户输入的两次密码,判断两次密码是否一致,并将判 ...

  9. Eclipse 双击变量,其他相同变量有底色

    转载:http://blog.csdn.net/majian_1987/article/details/46691697 方便下次查找. 在Eclipse中,鼠标选中或者光标移动到Java类的变量名时 ...

  10. URL的截取问题

    $(function (){ if (window.location.href.includes('?')) { if (window.location.href.split('?')[1].spli ...