数据库索引为什么使用B+树?
概述
B tree: 二叉树(Binary tree),每个节点只能存储一个数。
**B-tree:**B树(B-Tree,并不是B“减”树,横杠为连接符,容易被误导)
B树属于多叉树又名平衡多路查找树。每个节点可以多个数(由磁盘大小决定)。
B+tree 和 B*tree 都是 B-tree的变种
索引为什么是用B树呢?
一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。而B-/+/*Tree,经过改进可以有效的利用系统对磁盘的块读取特性,在读取相同磁盘块的同时,尽可能多的加载索引数据,来提高索引命中效率,从而达到减少磁盘IO的读取次数。
不了解磁盘相关知识的可以查看 硬盘基本知识(磁头、磁道、扇区、柱面)
下面通过示意图来看一下,B-tree、B+tree、B*tree
B-tree
从图中可以看出,B-tree 利用了磁盘块的特性进行构建的树。每个磁盘块一个节点,每个节点包含了很关键字。把树的节点关键字增多后树的层级比原来的二叉树少了,减少数据查找的次数和复杂度。
B-tree巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页(每页为4K),这样每个节点只需要一次I/O就可以完全载入。
B-tree 的数据可以存在任何节点中。
B+tree
B+tree 是 B-tree 的变种,数据只能存储在叶子节点。
B+tree 是 B-tree 的变种,B+tree 数据只存储在叶子节点中。这样在B树的基础上每个节点存储的关键字数更多,树的层级更少所以查询数据更快,所有指关键字指针都存在叶子节点,所以每次查找的次数都相同所以查询速度更稳定;
如果每个节点能存放M个数据,每个节点的数据在M/2到M之间。预留出空间可以插入新的数据。
B*tree
B*tree 每个磁盘块中又添加了对下一个磁盘块的引用。这样可以在当前磁盘块满时,不用扩容直接存储到下一个临近磁盘块中。当两个邻近的磁盘块都满时,这两个磁盘块各分出1/3的数据重新分配一个磁盘块,这样这三个磁盘块的数据都为2/3。
如果每个节点能存放M个数据,每个节点的数据在2M/3到M之间。预留出空间可以插入新的数据。
在B+树的基础上因其初始化的容量变大,使得节点空间使用率更高,而又存有兄弟节点的指针,可以向兄弟节点转移关键字的特性使得B*树额分解次数变得更少;
想了解更多精彩内容请关注我的公众号
本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8
点击这里快速进入简书
GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT
数据库索引为什么使用B+树?相关推荐
- 为什么MySQL数据库索引选择使用B+树?
在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使 ...
- 数据库索引数据结构总结——ART树就是前缀树
数据库索引数据结构总结 from:https://zhewuzhou.github.io/2018/10/18/Database-Indexes/ 摘要 数据库索引是数据库中最重要的组成部分,而索引的 ...
- 数据库索引的数据结构b+树
b+树的查找过程:如上图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针, ...
- 数据库索引是什么?新华字典来帮你!
点击蓝色"程序猿DD"关注我哟 来源:https://zhuanlan.zhihu.com/p/57359378 学过服务器端开发的朋友一定知道,程序没有数据库索引也可以运行.但是 ...
- 数据库索引,到底是什么做的?-- 转自沈剑公众号
问题1. 数据库为什么要设计索引? 图书馆存了1000W本图书,要从中找到<架构师之路>,一本本查,要查到什么时候去? 于是,图书管理员设计了一套规则: (1)一楼放历史类,二楼放文学类, ...
- 数据库索引相关面试题
1.索引的底层实现原理和优化 B+树,经过优化的B+树,主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,因此InnoDB建议为大部分表使用默认自增的主键作为主索引. 3.什么情况下设置了索引但 ...
- 什么是m叉树_不懂数据库索引的底层原理?那是因为你心里没点b树
点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:苏苏喂 cnblogs.com/sujing/p/11110292.html 题外话 ...
- mysql 节点查根_(三)B数、B+树及在数据库索引中应用
在算法逻辑上,二叉树的查找效率和比较次数都是最小的,但是在实际问题中,还要考虑磁盘IO. 数据库索引是存储在磁盘上的,当数据量比较大时,索引可能几个G. 当我们利用索引查询的时候,不能将整个索引全部加 ...
- B-树和B+树的应用:数据搜索和数据库索引
http://blog.csdn.net/hguisu/article/details/7786014 http://blog.csdn.net/xlgen157387/article/details ...
最新文章
- 连接oracle内存溢出,Linux主机内存溢出导致oracle的SYS用户无法正常登陆
- c语言键盘回调函数键盘的码,深入浅出剖析C语言函数指针与回调函数(三)
- PHP框架 one 1.6.0 发布
- 离职人员防止删除文件域策略
- 编程疑难杂症の设置正确却无效的事件代码
- SAP UI5 setProperty 的执行逻辑单步调式和分析
- 一步步学习如何安装并使用SAP HANA Express Edition
- linux中登录p4后,linux下perforce(p4)的使用方法和命令
- ygo游戏王卡组_游戏王:二线卡组脱颖而出的战将,混沌青眼卡组,仪式卡组的骄傲...
- PHP生成TXT文件并自动下载
- Java web登录验证码
- 断网重启路由器就好_为什么总是断网重启路由器就好了
- 浏览器输入网址后发生了什么?
- Excel 2010 VBA 入门 129 利用窗体向工作表中录入数据
- 在JS中根据身份证号计算出生日期和年龄
- 我迄今见过最完美的中文编程开发工具
- 【蓝桥杯选拔赛真题07】python输出乘积 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析
- 百度鹰眼轨迹后台的移植
- 微信小程序优惠券列表领取(send-coupon插件)
- php提示 Notice: Use of undefined constant name - assumed
热门文章
- 三十五、Scrapy 中的杂知识总结和代理池的编写
- 听说Attention与Softmax更配哦~
- 48小时单GPU训练DistilBERT!这个检索模型轻松达到SOTA
- 是否要入坑强化学习,看了这篇文章再说
- ICML 2020 | Google提出最强生成式摘要预训练模型——天马
- 足球 Floyd算法
- 使用vue脚手架模块化开发
- php redis 主从配置,Redis主从及其PHP扩展安装配置
- 代理服务器之正向代理和反向代理
- Spring Boot 内置Tomcat——getServletContext().getRealPath()为临时目录问题解决方案