为什么大多数数据库索引都使用B+树来实现呢?这涉及到数据结构、操作系统、计算机存储层次结构等等复杂的理论知识,但是不用担心,这篇文章20分钟之后就会给你答案。

这篇文章是一系列数据库索引文章中的最后一篇,这个系列包括了下面四篇文章:

  1. 数据库索引是什么?新华字典来帮你 —— 理解
  2. 数据库索引融会贯通 —— 深入
  3. 20分钟数据库索引设计实战 —— 实战
  4. 数据库索引为什么用B+树实现? —— 扩展

这一系列涵盖了数据库索引从理论到实践的一系列知识,一站式解决了从理解到融会贯通的全过程,相信每一篇文章都可以给你带来更深入的体验。

为什么使用B+树?

大家在数学课上一定听说过一个例子,在一堆已经排好序的数字当中找出一个特定的数字的最好办法是一种叫“二分查找”的方式。具体的过程就是先找到这些数字中间的那一个数,然后比较目标数字是大于还是小于这个数;然后根据结果继续在前一半或者后一半数字中继续查找。

这就类似于数据结构中的二叉树,二叉树就是如下的一种结构,树中的每个节点至多可以有两个子节点,而B+树每个节点则可以有N个子节点。

这里就不具体展开讲解二叉树了,我们只需要知道,平衡的二叉树是内存中查询效率最高的一种数据结构就可以了。

但是目前常用的数据库中,绝大多数的索引都是使用B+树实现的。那么为什么明明是二叉树查询效率最高,数据库中却偏偏要使用B+树而不是二叉树来实现索引呢?

计算机存储层次结构

计算机中的存储结构分为好几个部分,从上到下大致可以分为寄存器、高速缓存、主存储器、辅助存储器。其中主存储器,也就是我们常说的内存;辅助存储器也被称为外存,比较常见的就是磁盘、SSD,可以用来保存文件。在这个存储结构中,每一级存储的速度都比上一级慢很多,所以程序访问越上层存储中的数据,速度就会越快。

有过编程经验的小伙伴都知道,程序运行过程中操作的基本都是内存,对外存中数据的访问往往需要写一些文件的读取和写入代码才能实现。这正是因为CPU的计算速度比存储的I/O速度(输入/输出速度)快很多所做的优化,因为CPU在每次计算完成之后就需要等待下一批的数据进入,这个等待的时间越短,计算机运行得越快。

所以对于数据库索引来说,因为数据量很大,所以基本都是保存在外存中的,这样的话数据库读取一个索引节点的成本就非常大了。在数据量一样大的情况下,我们可以知道,B+树的单个节点中包含的值个数越多那么树中需要的节点总数就会越少,这样查询一次数据需要访问的节点数就更少了。

如果你对B+树还不熟悉,可以到这篇文章中找到答案——数据库索引融会贯通 。

如果我们把二叉树看做是特殊的B+树(每个节点只有一个值和前后两个指针的B+树),那么就可以得出结论:因为B+树的节点中包含的值个数(多个值)比二叉树(1个值)更多,所以在B+树中查询所需要的节点数就更少。那么如果每次读取的成本是一样的话,因为总成本=读取次数*单次读取成本,我们就可以证明B+树的查询成本就比二叉树小得多了。

节点读取成本

但是我们知道,读取更多数据肯定会需要更大的成本,那么为什么数据库索引使用B+树还是会比二叉树更好呢?这就需要一些更高深的操作系统知识来解释了。

在现代的操作系统中,把数据从外存读到内存所使用的单位一般被称为“页”,每次读取数据都需要读入整数个的“页”,而不能读入半页或者0.8页。一页的大小由操作系统决定,常见的页大小一般为4KB=4096字节。所以不管我们是要读取1字节还是2KB,最后都是需要读入一个完整的4KB大小的页的,那么一个节点的读取成本就取决于需要读入的页数。

在这样的情况下,如果一个节点的大小小于一页的大小,那么就会有一部分时间花在读取我们根本不需要的数据上(节点之外的数据),二叉树在这方面就会浪费很多时间;而如果一个节点的大小大于一页,哪怕是一页的整数倍,那我们也可能在一个节点的中间就找到了我们需要的指针进入了下一级的节点,这样这个指针后面的数据都白白读取了,如果不需要这些数据可能我们就可以少读几页了。

所以,综上所述,数据库索引使用节点大小恰好等于操作系统一页大小的B+树来实现是效率最高的选择。

数据库索引为什么用B+树实现?相关推荐

  1. 为什么MySQL数据库索引选择使用B+树?

    在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使 ...

  2. 数据库索引数据结构总结——ART树就是前缀树

    数据库索引数据结构总结 from:https://zhewuzhou.github.io/2018/10/18/Database-Indexes/ 摘要 数据库索引是数据库中最重要的组成部分,而索引的 ...

  3. 数据库索引为什么使用B+树?

    概述 B tree: 二叉树(Binary tree),每个节点只能存储一个数. **B-tree:**B树(B-Tree,并不是B"减"树,横杠为连接符,容易被误导) B树属于多 ...

  4. 数据库索引的数据结构b+树

    b+树的查找过程:如上图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,             ...

  5. 数据库索引是什么?新华字典来帮你!

    点击蓝色"程序猿DD"关注我哟 来源:https://zhuanlan.zhihu.com/p/57359378 学过服务器端开发的朋友一定知道,程序没有数据库索引也可以运行.但是 ...

  6. 数据库索引,到底是什么做的?-- 转自沈剑公众号

    问题1. 数据库为什么要设计索引? 图书馆存了1000W本图书,要从中找到<架构师之路>,一本本查,要查到什么时候去? 于是,图书管理员设计了一套规则: (1)一楼放历史类,二楼放文学类, ...

  7. 数据库索引相关面试题

    1.索引的底层实现原理和优化 B+树,经过优化的B+树,主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,因此InnoDB建议为大部分表使用默认自增的主键作为主索引. 3.什么情况下设置了索引但 ...

  8. 什么是m叉树_不懂数据库索引的底层原理?那是因为你心里没点b树

    点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:苏苏喂 cnblogs.com/sujing/p/11110292.html 题外话 ...

  9. mysql 节点查根_(三)B数、B+树及在数据库索引中应用

    在算法逻辑上,二叉树的查找效率和比较次数都是最小的,但是在实际问题中,还要考虑磁盘IO. 数据库索引是存储在磁盘上的,当数据量比较大时,索引可能几个G. 当我们利用索引查询的时候,不能将整个索引全部加 ...

  10. B-树和B+树的应用:数据搜索和数据库索引

    http://blog.csdn.net/hguisu/article/details/7786014 http://blog.csdn.net/xlgen157387/article/details ...

最新文章

  1. 【eclipse】配置author和commiter,git配置user.name和user.email
  2. 【HDU - 2612】Find a way(bfs)
  3. Oracle EBS数据定义移植工具:FNDLOAD
  4. 互联网晚报 | 1月26日 星期三 | 春晚正式入驻视频号;小红书合并社区与电商业务;中国电信5G消息正式商用...
  5. (7)css常用属性2
  6. 还在问跨域?本文记录js跨域的多种实现实例
  7. python 字典(dict)
  8. cocos2d-x画线
  9. javascript学习----window对象的学习与总结
  10. [Flex]实现Application未初始化前加载自定义配置内容
  11. 关于Hive数据仓库的那些事儿(一)模式设计
  12. 01背包问题c语言,遗传算法的0-1背包问题(c语言)
  13. 手机12306买卧铺下铺技巧_12306如何选择上下铺 选择上下铺小技巧
  14. 整站下载工具webHttracker webside copier
  15. [codeforces 1384A] Common Prefixes 上一字串是当前字串的基础(构造)
  16. 5月31日互联网理财产品收益播报:余额宝再跌
  17. 解决Chrome或Microsoft Edge浏览器打开时自动跳转到hao123
  18. 知识点索引:一元函数的极值
  19. 十九、D触发器做二分频器解析:
  20. 银河麒麟V10操控系统Qt安装

热门文章

  1. 配置Pylint for Python3.5
  2. 面试题3二维数组中的查找
  3. 21日请假一天陪妈妈去国博
  4. 夏梦竹谈Hive vs. HBase的区别
  5. 中科大软件学院第一学期总结
  6. (7)zabbix资产清单inventory管理
  7. php面试题——Linux部分(高级部分)
  8. POJ2536 Gopher II【二分图最大匹配】
  9. 使用树莓派 Raspberry Pi 播放豆瓣 FM
  10. 机器学习中的决策树算法