Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mysql-为什么使用B+树

Mysql-为什么使用B+树

原创
作者头像
Get
发布于 2024-03-10 13:13:06
发布于 2024-03-10 13:13:06
1940
举报

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

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


优点:可以解决大量数据索引无法一次加载进内存中的问题,二叉搜索树可以批量加载数据进内存
缺点:检索时间与树的高度有关,树的高度越高,检索次数及时间相对就越久
     极端情况下,如果数据本身就是有序的,二叉搜索树就会退化成链表,性能会急剧降低(弊端--链化)
clipboard.png
clipboard.png
代码语言:java
AI代码解释
复制
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、查1032、回旋查找的问题:
   查找大于5的数据:先定位到5,然后再往回查找大于5的数据,若大于5的数据很多时,效率则很慢
clipboard.png
clipboard.png
代码语言:java
AI代码解释
复制
B-Trees树的特性
B-树所有节点中不仅存储键值,也会存储数据(key,value)
1、根节点至少包括两个孩子
2、树中每个节点最多含有m个孩子(m>=2(m个孩子就称之为m阶树)
3、关键字个数最多为m-1(根据孩子结点来的,比孩子结点少一个)
4、除根节点和叶节点外,其他每个节点至少有ceil(m/2)个孩子
   (为什么是ceil(m/2),主要是为了最大限度降低层高,提高搜索效率。)
5、所有叶子节点都位于同一层

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

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

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

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


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

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL索引底层:B+树详解
当我们发现SQL执行很慢的时候,自然而然想到的就是加索引。对于范围查询,索引的底层结构就是B+树。今天我们一起来学习一下B+树哈~
捡田螺的小男孩
2021/03/15
8430
Mysql为什么最终用B+树做索引?
索引能极大的减少存储引擎需要扫描的数据量 索引可以把随机IO变成顺序IO(索引指向(左小右大)) 索引可以帮助我们在进行分组、排序等操作时,避免使用临时表
名字是乱打的
2021/12/22
1.3K0
Mysql为什么最终用B+树做索引?
从B 树、B+ 树、B* 树谈到R 树
说明:本文从B树开始谈起,然后论述B+树、B*树,最后谈到R 树。其中B树、B+树及B*树部分由weedge完成,R 树部分由Frankie完成,全文最终由July统稿修订完成。
bear_fish
2018/09/14
2.4K0
从B 树、B+ 树、B* 树谈到R 树
为什么MySQL数据库索引选择使用B+树?
我们在MySQL中的数据一般是放在磁盘中的,读取数据的时候肯定会有访问磁盘的操作,磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动。盘片旋转就是我们市面上所提到的多少转每分钟,而磁盘移动则是在盘片旋转到指定位置以后,移动磁臂后开始进行数据的读写。那么这就存在一个定位到磁盘中的块的过程,而定位是磁盘的存取中花费时间比较大的一块,毕竟机械运动花费的时候要远远大于电子运动的时间。当大规模数据存储到磁盘中的时候,显然定位是一个非常花费时间的过程,但是我们可以通过B树进行优化,提高磁盘读取时定位的效率。
用户3467126
2019/08/05
1.6K0
为什么MySQL数据库索引选择使用B+树?
讲透学烂二叉树(二):图中树的定义&各类型树的特征分析
日常中我们见到的二叉树应用有,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,以及B-Tree,B+-Tree在文件系统,都是通过红黑树去实现的。虽然之前写过《再谈堆排序:堆排序算法流程步骤透解—最大堆构建原理》但是二叉树的基本性质,对我来说,从入门到放弃是搞了好几回。
周陆军
2020/06/06
1.7K0
It's Design——为什么MySQL使用B+树?
相信每一个后台开发工程师在面试过程中,都曾经被问到过“MySQL的默认存储引擎是什么?MySQL索引是什么数据结构?”这样的问题。相信准备充分(熟读八股文)的大家都能很容易的回答出“MySQL的默认存储引擎是InnoDB,MySQL索引使用的是B+树。”这样的答案。但是为什么当初写MySQL的程序员大叔要这样子来设计呢?
yuann
2021/04/15
9550
It's Design——为什么MySQL使用B+树?
图解:什么是B-树、B+树、B*树
6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
你好戴先生
2020/09/03
11K2
mysql 中的innoDB 引擎的B+树索引
在优化慢接口的时候,遇到一个问题,在通过索引查询数据库表的时候根据时间区间去扫描表的时候,开始时间时表扫描的其实位置吗?或者说根据时间日期B+索引能一次性定位到具体的时间位置吗?是的不能。那为什么不能呢? 接下来我们来看看b+树索引的底层数据结构。
袁新栋-jeff.yuan
2020/08/26
9790
mysql 中的innoDB 引擎的B+树索引
InnoDB为什么要选择B+树来存储数据
关于InnoDB索引,我们可能知道InnDB索引是用B+树实现的,而B+树就是一种能优化查询速度的数据结构。但我们又没想过这样一个问题,能优化查询速度的数据结构有很多,为什么InnoDB要采用B+树?
weylan
2021/11/09
1.9K0
红黑树、B树、B+树
现代操作系统都使用虚拟内存来印射到物理内存,内存大小有限且价格昂贵,所以数据的持久化是在磁盘上。虚拟内存、物理内存、磁盘都使用页作为内存读取的最小单位。一般一页为4KB(8个扇区,每个扇区512B,8*512B=4KB)。
派大星在吗
2021/12/05
7500
MySQL数据库索引选择为什么使用B+树而不是跳表?
在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使用B+树!
小冷coding
2023/05/24
9100
MySQL数据库索引选择为什么使用B+树而不是跳表?
MySQL索引底层为什么用B+树?看完这篇文章,轻松应对面试
面试官: 你知道MySQL索引底层数据结构为啥用B+树?而不用B树、红黑树或者普通二叉树?
一灯架构
2022/09/26
8190
MySQL索引底层为什么用B+树?看完这篇文章,轻松应对面试
理解 B+ 树算法
本文介绍了B+树的基本概念、特点、结构以及其在数据库和文件系统中的应用。B+树通过平衡数据存储和查询效率,在插入、删除和查询操作中表现出较好的性能。主要应用在数据库索引和文件系统中,如NTFS、ReiserFS和InnoDB存储引擎等。
serena
2017/10/20
2.7K0
理解 B+ 树算法
好文 | MySQL 索引B+树原理,以及建索引的几大原则
注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的。
Java技术栈
2019/05/07
1.1K0
好文 | MySQL 索引B+树原理,以及建索引的几大原则
MySQL索引为什么要用B+树实现?
在从一堆数据中查找指定的数据时,我们常用的数据结构是哈希表和二叉查找树,表本质上就是一堆数据的集合,所以MySQL数据库用了B+树和哈希表来实现索引
Java识堂
2019/08/13
6190
MySQL索引为何选择B+树
本文所述的各种数据结构(二叉树等),均不考虑重复值的情况,本文简述各种数据结构的区别仅仅只是为了理解MySQL索引的需要而做的铺垫。
IT大咖说
2020/09/23
6420
MySQL索引为何选择B+树
MySql进阶索引篇01——深度讲解索引的数据结构:B+树
索引是存储引擎中一种用于快速找到数据的存储结构,他就像《新华字典》的目录,可以使我们查每个字的速度大大提升。
半旧518
2022/10/26
2.6K0
MySql进阶索引篇01——深度讲解索引的数据结构:B+树
Mysql InnoDB 为啥选择B+树索引 转
Mysql数据库中的常见索引有多种方式,例如Hash索引,B-树索引,B+树索引,但是为啥mysql中默认是采用B+树索引索引呢?下面对这三种索引学习总结一下。B+树到底有啥优势? B-树
双面人
2019/04/10
7010
MySQL和B树的不知道的那些事
若左子树不空,则左子树上所有节点的值均小于它的根节点的值 若右子树不空,则右子树上所有节点的值均大于它的根节点的值 它的左、右子树也分别为二叉排序数(递归定义)
终有救赎
2023/12/14
2950
MySQL和B树的不知道的那些事
B+树 -- MySQL数据库索引
为了加速数据库中数据的查找速度,我们常对表中数据创建索引。数据库索引是如何实现的呢?底层使用的是什么数据结构和算法呢?
Michael阿明
2021/02/20
7670
B+树 -- MySQL数据库索引
相关推荐
MySQL索引底层:B+树详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档