前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql-为什么使用B+树

Mysql-为什么使用B+树

原创
作者头像
Get
发布2024-03-10 21:13:06
1400
发布2024-03-10 21:13:06

https://www.bilibili.com/video/BV1yT4y1w7FS?from=search&seid=1538805982597498566&spm_id_from=333.337.0.0

代码语言:java
复制
1、普通二叉查找树:
左边节点值比根节点小,右边节点值比根节点大,复杂度O(n)


优点:可以解决大量数据索引无法一次加载进内存中的问题,二叉搜索树可以批量加载数据进内存
缺点:检索时间与树的高度有关,树的高度越高,检索次数及时间相对就越久
     极端情况下,如果数据本身就是有序的,二叉搜索树就会退化成链表,性能会急剧降低(弊端--链化)
clipboard.png
clipboard.png
代码语言:java
复制
2、平衡二叉树:
它是动态的,左右同一层级左右子树的绝对值不会大于1,其随着树的高度增加,查找速度也越来越慢,复杂度O(logn)

优点:始终保持同一级左右子树的绝对值不会大于1
缺点:
1、数据的深度(高度)决定着他的IO操作次数,IO操作耗时大
2、每一个磁盘块(节点/页)保存的数据量太小了,没有很好的利用操作磁盘IO的数据交换特性, 
   也没有利用好磁盘IO的预读能力, 从而带来频繁的IO操作
   
   交换特性:我们可以一次读4K数据的,现在只读了1个结点进去,而且这个结点只存了一个数据,非常浪费操作系统资源
   预读能力:每一次IO时,不仅仅把当前磁盘地址的数据加载到内存,同时也把相邻数据也加载到内存缓冲区中

以平衡二叉树结点为例,讲解一下mysql中索引存在的结构模型:
1、mysql中,一个结点通常以磁盘块存在,磁盘块中保留着关键字、数据区、子节点引用
2、其中关键字一半是指我们在建立索引时候的依据,(比如以id为索引,那么关键字就是id)
3、数据区一般指向真正的数据地址,子节点引用是指向的较小的左磁盘块和关键字值更大的右磁盘块。
4、我们采用树状结构优化索引不需要一次加载所有磁盘块,而只需要依次比较并加载即可。
5、如下图,我们找id为8的数据,先加载磁盘块1,发现8<10,通过磁盘块1的左子节点引用找到磁盘块2并加载,
   8>5...加载磁盘块5,匹配数据,并通过数据区找到真正数据位置。
   
例:   
1、查10:3次
2、回旋查找的问题:
   查找大于5的数据:先定位到5,然后再往回查找大于5的数据,若大于5的数据很多时,效率则很慢
clipboard.png
clipboard.png
代码语言:java
复制
B-Trees树的特性
B-树所有节点中不仅存储键值,也会存储数据(key,value)
1、根节点至少包括两个孩子
2、树中每个节点最多含有m个孩子(m>=2)(m个孩子就称之为m阶树)
3、关键字个数最多为m-1个(根据孩子结点来的,比孩子结点少一个)
4、除根节点和叶节点外,其他每个节点至少有ceil(m/2)个孩子
   (为什么是ceil(m/2),主要是为了最大限度降低层高,提高搜索效率。)
5、所有叶子节点都位于同一层

例:
1、查10:2次。   解决了树的高度问题:树越矮,查找速度越快
2、回旋查找的问题:(依然存在)
   查找大于5的数据:先定位到5,然后再往回查找大于5的数据,若大于5的数据很多时,效率怎很慢
clipboard.png
clipboard.png
代码语言:java
复制
B+Trees树 的特性:
1、非叶子节点只存储key值,不存储数据的。
2、叶子节点即存储(key,value),即存储数据。
3、B+Trees树 比 B-Trees树 多了一个单向链表(非叶子节点),链表对所有数据进行了一个从小到大排序

为什么B+Tree更适合用来做存储索引?
1、B+树的磁盘读写代价更低:
2、B+树的查询效率更加稳定:
3、B+树天然有序,更有利于对数据库的扫描:

为什么使用B+树:
1、B+ 树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的,链表连着的。
2、那么 B+ 树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。
3、B+ 树的非叶子节点不存放实际的记录数据,仅存放索引,因此数据量相同的情况下,相比存储即存索引又存记录的 B 树,
   B+ 树的非叶子节点可以存放更多的索引,因此 B+ 树可以比 B 树更「矮胖」,查询底层节点的磁盘 I/O次数会更少。

Hash 索引和 B+ 树索引区别是什么?
1、B+ 树可以进行范围查询,Hash 索引不能。
2、B+ 树支持联合索引的最左侧原则,Hash 索引不支持。
3、B+ 树支持 order by 排序,Hash 索引不支持。
4、Hash 索引在等值查询上比 B+ 树效率更高。
5、B+ 树使用 like 进行模糊查询的时候,like 后面(比如%开头)的话可以起到优化的作用,Hash 索引根本无法进行模糊查询。


1、查10:3次。
2、回旋查找的问题:通过单向链表解决了该问题(所以该B+树范围查找速度非常快,这也是为什么排序的时候,需要使用索引排序)
   查找大于5的数据:先定位到5,然后直接把5后面的数据直接从单链表中拿出来,不用再向之前通过回旋查找一个一个拿去大于5的值。
clipboard.png
clipboard.png

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档