在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

B-Tree

B-Tree是一种平衡的多路**查找(又称排序)**树,在文件系统中和数据库系统中有所应用。主要用作文件的索引。其中的B就表示平衡(Balance)

B-Tree的特性

为了描述B-Tree,首先定义一条数据记录为一个二元组[key, data],key为记录的键值,对于不同数据记录,key是互不相同的;data为数据记录除key外的数据。那么B-Tree是满足下列条件的数据结构:

d为大于1的一个正整数,称为B-Tree的度

h为一个正整数,称为B-Tree的高度

key和指针互相间隔,节点两端是指针

一个节点中的key从左到右非递减排列

所有节点组成树结构

每个指针要么为null,要么指向另外一个节点

每个非叶子节点由n-1个key和n个指针组成,其中d<=n<=2d

每个叶子节点最少包含一个key和两个指针,最多包含2d-1个key和2d个指针,叶节点的指针均为null

所有叶节点具有相同的深度,等于树高h

如果某个指针在节点node最左边且不为null,则其指向节点的所有key小于key1,其中key1为node的第一个key的值

如果某个指针在节点node最右边且不为null,则其指向节点的所有key大于keym,其中keym为node的最后一个key的值

如果某个指针在节点node的左右相邻key分别是keyi和keyi+1且不为null,则其指向节点的所有key小于keyi+1且大于keyi

B-Tree查找数据

B-Tree是一个非常有效率的索引数据结构。这主要得益于B-Tree的度可以非常大,高度会变的非常小,只需要二分几次就可以找到数据。例如一个度为d的B-Tree,设其索引N个key,则其树高h的上限为logd((N+1)/2)),检索一个key,其查找节点个数的渐进复杂度为O(logdN)。

在B-Tree中按key检索数据的算法非常直观:

  1. 首先从根节点进行二分查找,如果找到则返回对应节点的data

  2. 否则对相应区间的指针指向的节点递归进行查找,如果找到则返回对应节点的data

  3. 如果找不到,则重复过程2,直到找到节点或找到null指针,前者查找成功,后者查找失败。

B+Tree

B+Tree是B-Tree的一种变种。一般来说,B+Tree比B-Tree更适合实现外存储索引结构,具体原因与外存储器原理及计算机存取原理有关,将在下篇文章中讨论。

B+Tree的特性

区别于B-Tree:

每个节点的指针上限为2d而不是2d+1

内节点不存储data,只存储key;叶子节点不存储指针

带有顺序访问指针的B+Tree

一般在数据库系统或者文件系统中,并不是直接使用B+Tree作为索引数据结构的,而是在B+Tree的基础上做了优化,增加了顺序访问指针。提升了区间查询的性能。

如上图所示,在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。例如要查询18到30之间的数据记录,只要先找到18,然后顺着顺序访问指针就可以访问到所有的数据节点。这样就提升了区间查询的性能。数据库的索引全扫描 index索引范围扫描 range 就是基于此实现的。

参考

MySQL索引背后的数据结构及算法原理


                                                            -----END-----

喜欢本文的朋友们,欢迎扫一扫下图关注公众号撸码那些事,收看更多精彩内容

数据库索引背后的数据结构相关推荐

  1. 【数据库索引背后的数据结构】一个常见的面试题,详解B+树结构

    前言: 大家好,我是良辰丫,数据库索引背后的数据结构是什么呢?我们学过索引的大多数人都知道是B+树,但是为什么使用B+树作为索引的数据结构呢?这是一道常见的面试题,接下来我们就一起开启对索引背后的数据 ...

  2. java 数据结构 数据库_数据库索引背后的数据结构

    在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法.这种数据结构,就是索引. B-Tree B-Tree是一种 ...

  3. MySQL索引背后的数据结构及算法原理【转】

    http://blog.codinglabs.org/articles/theory-of-mysql-index.html MySQL索引背后的数据结构及算法原理[转] 摘要 本文以MySQL数据库 ...

  4. MySQL索引背后的数据结构及算法原理--转

    MySQL索引背后的数据结构及算法原理 作者 张洋 | 发布于 2011-10-18 MySQL 索引 B树 优化 原文地址:http://blog.codinglabs.org/articles/t ...

  5. MySQL 索引背后的数据结构及算法原理

    本文转载自http://blog.jobbole.com/24006/ 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储 ...

  6. 面试必问:一文弄懂MySQL数据库索引之底层数据结构和索引类型

    面试必问:一文弄懂MySQL数据库索引之底层数据结构和索引类型 前言 一.索引 1.1作用 1.2特点 1.3使用 1.3.1创建索引 1.3.2删除索引 1.3.3查看表中的索引 1.3.4查看SQ ...

  7. mysql数据库算法_数据库:MySQL索引背后的数据结构及算法原理【转】

    原文:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话 ...

  8. mysql匹配数据结构_MySQL索引背后的数据结构及原理

    前两天经历了武汉一行腾讯面试,数据库索引是一个面试热点,在此搜集相关资料,以备学习之用. 下面是一位牛人写得关于数据库索引的精品之作,因为很好,不敢修饰,转载至此与博友共享. 本文以MySQL数据库为 ...

  9. mysql索引背后的数据结构及算法

    摘自:http://blog.jobbole.com/24006/ 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引 ...

最新文章

  1. 我的 Atom 插件,有图
  2. mysql中主从复制需要的酶_mysql主从复制
  3. POJ1149 PIGS(最大流)
  4. Java基础day13
  5. PyTorch学习笔记:torch.optim---Optimizer以及lr_scheduler
  6. 一键搞定数码照片印前特效-【用可牛影像】
  7. 三位数流水码的生成(000·····009··00A····00Z····ZZZ)
  8. 设计灵感|展览海报的设计没有头绪?
  9. gradle入门(1-7)eclipse和gradle集成插件的安装和使用
  10. 在WebForm戏说 js的注释
  11. Matlab实现Compow协议,optisystem和matlab协同仿真
  12. 3.15PMP试题每日一题
  13. 密码学-代数数论基本知识
  14. 【计算电磁学】使用FDTD的矩形微带贴片天线MATLAB仿真
  15. PostgreSQL系列- 3- 客户端工具
  16. 如何清除Excel2007中的网格线?
  17. 图解 Python 编程(6) | 条件控制与if语句(附要点速查表·完结)
  18. python之获取文件当前位置和定位某个位置
  19. python seo 采集内容_SEO如何处理采集内容(4)–转自{GoGo闯}
  20. python汇率转换_python汇率兑换

热门文章

  1. 009_Raphael绘制图形
  2. linux 硬件抽象,Linux 内核硬件抽象
  3. 第一篇:构建Mysql服务器
  4. linux管道阻塞代码,linux中的管道
  5. 2020 mse 清华_ICSMSE 2020
  6. python3发送https请求_关于python 3.x:如何在不引起python3的SSL证书错误的情况下将POST请求发送到https...
  7. 学计算机科学与技术考研考哪些专业课程,计算机科学与技术考研考哪些科目 备考技巧有哪些...
  8. python 反向传值_Django中reverse反转并且传递参数的方法
  9. 基于Java的RDMA高性能通信库(六):SDP - Java Socket Direct Protocol
  10. mysql syncbinlog_Mysql之sync-binlog参数