首页 > 数据库 >MySQL用B+树(而不是B树)做索引的原因

MySQL用B+树(而不是B树)做索引的原因

时间:2023-04-17 18:58:39浏览次数:42  
标签:结点 遍历 叶子 索引 查找 MySQL 节点 原因

众所周知,MySQL的索引使用了B+树的数据结构。那么为什么不用B树呢?

先看一下B树和B+树的区别。

1.B树

维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。

B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在数据库和文件系统。” B 树可以看作是对查找树的一种扩展,即他允许每个节点有M-1个子节点。

1.1定义

  • 根节点至少有两个子节点
  • 每个节点有M-1个key,并且以升序排列
  • 位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间
  • 其它节点至少有M/2个子节点

下图是一个M=4 阶的B树:

可以看到B树是2-3树的一种扩展,他允许一个节点有多于2个的元素。

B树的插入及平衡化操作和2-3树很相似,这里就不介绍了。下面是往B树中依次插入
6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4 的演示动画:

2.B+树

B+树是对B树的一种变形树,它与B树的差异在于:

  • 有k个子结点的结点必然有k个关键码。
  • 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。
  • 树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。

如下图是一个B+树:

 下图是B+树的建立过程:

3.B+树和B树的区别

B+树的非叶子结点只包含导航信息,不包含实际的值,所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历。

B+ 树的优点在于:

  • IO次数更少:由于B+树在内部节点上不包含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。因此访问叶子节点上关联的数据也具有更好的缓存命中率。
  • 遍历更加方便:B+树的叶子结点都是相链的,因此对整棵树的遍历只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。

但是B树也有优点,其优点在于,由于B树的每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速。下面是B 树和B+树的区别图:

4.为什么MySQL选择B+树做索引

B+树的磁盘读写代价更低:B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。

B+树的查询效率更加稳定:由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

B+树更便于遍历:由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。

B+树更适合基于范围的查询:B树在提高了IO性能的同时并没有解决元素遍历的我效率低下的问题,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低。

 

标签:结点,遍历,叶子,索引,查找,MySQL,节点,原因
From: https://www.cnblogs.com/imreW/p/17326796.html

相关文章

  • 阿里云部署mysql(本地上传)
    1.阿里云试用一个月活动2.选择机器配置为:2核4G内存3M带宽40G云盘centOS7.964位(这个配置刚好吃满优惠)3.将要安装的版本是MySQL8.0.314.到MySQL官网下载,版本为Community版本,对应操作系统是RedHat,操作系统版本是Linux7X865.MySQL8.0.31下载链接6.下载完成后,解压,并使用xsh......
  • mysql优化思路(本地上传)
    MySQL优化从四个方面入手硬件和操作系统层面的优化架构设计层面的优化MySQL程序配置的优化SQL执行的优化1.硬件和操作系统层面的优化硬件层面主要是cpu,内存,网络带宽,磁盘读写操作系统主要是网络配置,应用文件句柄数(这部分优化由DBA或运维完成,加硬件投入解决100%问题,所以要......
  • mysql常用sql语句
    INSERTINTO`test`.`testdb`(`a`,`b`)VALUES(NULL,'2');INSERTINTO`test`.`testdb`(`b`)VALUES('2');imit是mysql的语法select*fromtablelimitm,n其中m是指记录开始的index,从0开始,表示第一条记录n是指从第m+1条开始,取n条。select*fromtablenamelimit2,4......
  • Java与Mysql锁相关知识总结
    锁的定义在计算机程序中锁用于独占资源,获取到锁才可以操作对应的资源。锁的实现锁在计算机底层的实现,依赖于CPU提供的CAS指令(compareandswsp),对于一个内存地址,会比较原值以及尝试去修改的值,通过值是否修改成功,来表示是否强占到了这个锁。JVM中的锁jvm中,有2个常用的锁synchr......
  • 爬取的数据存mysql中、加代理,cookie,header,加入selenium、布隆过滤器、scrapy-redis实
    上节回顾#1scrapy架构 -爬虫:写的一个个类-引擎: -调度器:排队,去重-下载器-pipline-下载中间件-爬虫中间件#2命令 -scrapystartproject项目名-scrapygensipder爬虫名网址-scrapycrawl爬虫名字-run.py#......
  • 基于AI+数据驱动的慢查询索引推荐
    目前,美团内部每天产生的慢查询数量已经超过上亿条。如何高效准确地为慢查询推荐缺失的索引来改善其执行性能,是美团数据库研发中心面临的一项挑战。为此,我们与华东师范大学开展了科研合作,在AI领域对索引推荐进行了探索和实践,并将基于代价的方法和新提出的基于AI+数据驱动的方法共同......
  • Splunk DB Connect 连接MySQL报错CLIENT_PLUGIN_AUTH is required
    01、问题描述使用SplunkDBConnect连接MySQL数据库读库时,报错CLIENT_PLUGIN_AUTHisrequired,如下图:02、原因分析根据报错信息,查阅相关资料,了解到报错原因:目标数据库为MySQL5.7,使用的mysql-connector-java-8.0.28.jar,mysql的jar包版本过高。JDBC数据库驱动程序:mysql-connector-......
  • 发现Mysql的主从数据库没有同步,差点凉凉了
    摘要:今天发现Mysql的主从数据库没有同步,瞬间整个人头皮发麻。本文分享自华为云社区《糟了,生产环境数据竟然不一致,人麻了!》,作者:冰河。今天发现Mysql的主从数据库没有同步先上Master库:mysql>showprocesslist;查看下进程是否Sleep太多。发现很正常。showmasterstatus;也正常。mys......
  • windows系统mysql定时备份
    如下:一、创建bat任务脚本1.新建txt文档2.打开txt文档,并粘贴入以下内容3.按照自己的需求对内容进行修改,并删除掉//后内容以及中文空格,否则会运行失败4.保存,并将文件后缀修改为.bat格式5.双击测试程序是否能正常运行,如果正常,会弹出cmd运行窗口,运行完后会自动停止,此时会在路径下产......
  • 发现Mysql的主从数据库没有同步,差点凉凉了
    摘要:今天发现Mysql的主从数据库没有同步,瞬间整个人头皮发麻。本文分享自华为云社区《糟了,生产环境数据竟然不一致,人麻了!》,作者:冰河。今天发现Mysql的主从数据库没有同步先上Master库:mysql>showprocesslist;查看下进程是否Sleep太多。发现很正常。showmasterstatu......