mysql为什么要用b+树

mysql为什么要用b+树

先看原因:
1.B+树减少了IO次数,效率更高
(这里这么理解:-----就是减少了磁盘的访问次数,毕竟内存速度要比磁盘快的多)
2.B+树查询跟稳定,因为所有数据放在叶子节点
3.B+树范围查询更好,因为叶子节点指向下一个叶子结点


介绍

一般查询一堆数据会使用到的数据结构是:哈希表、B+树。mysql使用的是B+树。
B+树是通过二叉查找树,再由平衡二叉树(B-树)演变而来。
但B+树不是二叉树
科普:什么叫二叉树

  1. 叶节点最多拥有两个节点
  2. 叶节值于左边节点、于右边节点
  3. 没有值相等重复的节点;

二叉树如图:
mysql为什么要用b+树_第1张图片
比如:你想找到008,先和006比对,008大于006,则和007比对,一次类推。每一次比对都能排除一半的数据,是不是效率比较高。
既然二叉树查询效率比较高,那为啥还需引进平衡二叉树呢?
那是因为二叉树会有一种极端的情况:
mysql为什么要用b+树_第2张图片
这个也是满足二叉树的极端情况,你想找到0008的,则必须经过4次比对。效率低下!
平衡二叉树则是在二叉树的条件下多了一个限制条件:树的左右两边的层级数相差不会于1
这样就不会让二叉树处于一条线的极端情况了。
平衡叉树的查找效率确实很快,但维护颗平衡叉树的代价是常的,需要1次或多次左旋和右旋来得到插
或更新后树的平衡性。

那么又问题来了,既然平衡二叉树查询效率这么高了,为什么还需要引入B树和B+树呢???


B树和B+树

B树和B-树是同种树,假如平衡叉树实现索引效率已经很了,查找个节点所做的IO次数是这个节点所处
的树的度,因为我们法把整个索引都加载到内存,并且节点数据在磁盘中不是顺序排放的。所以最快情况下,
磁盘的IO次数为数的高度。虽然平衡叉树查找效率确实很,但是频繁的IO才是阻碍提性能的瓶颈,怎样减少IO次数呢?前辈们很聪明的提出了局部性原理,分为时间局部性原理,即加你查询id为1的户数据,过段时间你还会查询id为1的数据,所以会将这部分数据缓存下来。空间局部性原理,当你查询id为1的户数据的时候,你有很的概率会去查询id为2,3,4的户的数据,所以会次性的把id为1,2,3,4的数据都读到内存中去,这个最小的单位就是页。
简单来说CPU进行运算是电运动,计算速度很快。而将数据从硬盘读取到内存中是机械运动,很慢。我们在买硬盘的时候经常问这个硬盘是多少转(每分钟转动的圈数),7200转,5400转。所以说转动的越快加载数据越快,但是和CPU比起来差的还很远,所以说要减低IO次数。

B树:
mysql为什么要用b+树_第3张图片

b+树:
mysql为什么要用b+树_第4张图片

B+树和B树由什么区别?
1.B+树的的非叶子节点只存储索引,叶子节点存储数据(所以B+树能存储更多的索引,并且查询次数也是一样的)
2.B+树每个叶子节点都包含了根节点的键值数据,每个叶子节点的关键字从小到大链

在B树的基础上每个节点存储的关键字数更多,树的层级更少所以查询数据更快,所有关键字指针都存在叶?节 点,所以每次查找的次数都相同所以查询速度更稳定。 除此之外,B+树的叶?节点是跟后序节点相连接的,这对范围查找是?常有?的。 看到没B+树的?叶?节点是主键,主键占?的空间越?,每个节点能放的主键就能更多,这就是为什么我们的主键 ?般不设置太?的原因。主键占?的空间?,能降低树?,减少IO次数

未完待续~~~

最后

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。

你可能感兴趣的:(面试,学习路线,阿里巴巴,b树,mysql,数据结构,算法,ide)