MySql -- 为什么使用B+树做索引

news2024/11/16 23:36:37

再有人问你为什么MySQL用B+树做索引,就把这篇文章发给她

本文是参考上述文章进行总结和补充,大家感兴趣也可以阅读原文.

目录

1. 索引

2. 二叉搜索树 

3. 平衡二叉树

4. B树

5. B+树 

6.扩展 -- 聚集索引 VS 非聚集索引


1. 索引

概念:索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。

索引最形象的比喻就是图书的目录了。注意这里的大量,数据量大了索引才显得有意义,如果我想要在[1,2,3,4]中找到4这个数据,直接对全数据检索也很快,没有必要费力气建索引再去查找。

索引在mysql数据库中分三类: B+树索引, Hash索引, 全文索引

本文介绍的是工作开发中最常接触到innodb存储引擎中的的B+树索引。

👉👉👉innodb存储引擎https://baike.baidu.com/item/innodb/8970025?fr=aladdin

2. 二叉搜索树 

首先回顾一下,在数据结构系列学习的二叉搜索树,我们可以将数据建立索引,每个节点存储了key以及value.

二叉查找树的特点就是:任何节点的左子节点的键值都小于当前节点的键值,右子节点的键值都大于当前节点的键值。 顶端的节点我们称为根节点,没有子节点的节点我们称之为叶节点。 

如果我们需要查找id=12的用户信息,利用我们创建的二叉查找树索引,查找流程如下: 

  • 1. 将根节点作为当前节点,把12与当前节点的键值10比较,12大于10,接下来我们把当前节点>的右子节点作为当前节点。 

  • 2. 继续把12和当前节点的键值13比较,发现12小于13,把当前节点的左子节点作为当前节点。 

  • 3. 把12和当前节点的键值12对比,12等于12,满足条件,我们从当前节点中取出data,即id=12,name=xm。

以上的方式进行查找的时间复杂度是树的高度.

3. 平衡二叉树

如果我们建立的树是下方这个样子,那么我们查找数据的时间将会与在顺序表中查找的时间是一样的.

导致这个现象的原因其实是二叉查找树变得不平衡了,也就是高度太高了,从而导致查找效率的不稳定。为了解决这个问题,我们需要保证二叉查找树一直保持平衡,就需要用到平衡二叉树了。 平衡二叉树又称AVL树,在满足二叉查找树特性的基础上,要求每个节点的左右子树的高度差不能超过1。

4. B树

将节B树之前我们要先了解一下B树的查找元素原理以及如构造一颗B树

B树又称B-树,是一颗N叉搜索树.为什么出现了这个B树的概念呢,要解决的问题是什么,我们都要了解清楚.

     首先,数据库会将数据存储在磁盘这种外围设备中,因为内存有易失性.但是有一点,内存有着很大优势,那就是访问与读取数据的速度有着天壤之别,所以为了提高查找元素的效率,我们要减少从磁盘读取数据的次数,此外从磁盘读取数据的时候,都是按照磁盘块进行读取的,并不是一条一条的度读取,如果我们能够尽可能的将数据放在一个磁盘块中,那么一次读取的数据就会越多,那么查找的效率就会提高.为了解决上述问题我们应该建立一种单个节点可以存储多个键值和数据的平衡树。也就是我们接下来要说的B树。 

 从上图可以看出,B树相对于平衡二叉树,每个节点存储了更多的键值(key)和数据(data),并且每个节点拥有更多的子节点,子节点的个数一般称为阶,上述图中的B树为3阶B树,高度也会很低。基于这个特性,B树查找数据读取磁盘的次数将会很少,数据的查找效率也会比平衡二叉树高很多。

假如我们要查找id=28的用户信息,那么我们在上图B树中查找的流程如下: 

  • 1. 先找到根节点也就是页1,判断28在键值17和35之间,我们那么我们根据页1中的指针p2找到页3。 

  • 2. 将28和页3中的键值相比较,28在26和30之间,我们根据页3中的指针p2找到页8。 

  • 3. 将28和页8中的键值相比较,发现有匹配的键值28,键值28对应的用户信息为(28,bv)

5. B+树 

B+树是对B树的进一步优化。让我们先来看下B+树的结构图: 

B+树的特点:

1.一个节点,可以存储N个key,N个key划分出了N个区间

2.每个节点的key都会在子节点同时存在 , 同时也是子节点的最大key值

3.B+树的叶子结点是首尾相连,是一个双向的链表,而叶子节点中的数据是通过单向链表进行连接的.

4.由于叶子结点是完整的数据结合,只在叶子结点存储数表中的每一行完整的数据,而非叶子节点,只存在key值本身即可.

B+树的优势

1.当前一个节点保存更多的key,最终数的高度是相对更矮一些的,查询的时候减少了IO (硬盘的访问)的次数.(这里的优势是和B树是一样的)

2.所有的查询最终都会落到叶子结点上.(查询每一个数据,经过的IO次数是一样的)(这里就很稳定,可以对执行的效率进行一个评估).

3.B+树的所有叶子节点否成一个链表,此时比较方便进行查询.

4.由于数据都在叶子节点上,非叶子节点,只需要存储key值,导致了非叶子节点占用的空间是比较小的.可以讲这些非叶子节点在内存中进行缓存(或者缓存一部分),这样可以进一步减少IO的次数.

6.扩展 -- 聚集索引 VS 非聚集索引

1. 聚集索引(聚簇索引):以innodb作为存储引擎的表,表中的数据都会有一个主键,即使你不创建主键,系统也会帮你创建一个隐式的主键。这是因为innodb是把数据存放在B+树中的,而B+树的键值就是主键,在B+树的叶子节点中,存储了表中所有的数据。这种以主键作为B+树索引的键值而构建的B+树索引,我们称之为聚集索引。 

2. 非聚集索引(非聚簇索引):以主键以外的列值作为键值构建的B+树索引,我们称之为非聚集索引。非聚集索引与聚集索引的区别在于非聚集索引的叶子节点不存储表中的数据,而是存储该列对应的主键,想要查找数据我们还需要根据主键再去聚集索引中进行查找,这个再根据聚集索引查找数据的过程,我们称为回表。  
明白了聚集索引和非聚集索引的定义,我们应该明白这样一句话:数据即索引,索引即数据

聚焦索引就是上述我们讲的B+树查找的过程,叶子结点直接存储的查询表的数据.

非聚焦索引:叶子节点并没有存储数据,而是存储的该列对应的主键,通过这个主键我们再去通过聚焦索引进行查找,也就是在第一个B+树的叶子节点上又构建了一个新的B+树,这个过程叫做回表.

上述情况可以理解为:

如果一个表有多个索引,例如:针对id有索引,针对name也有一个索引,表的数据还是按照id为主键进行构建B+树,通过叶子结点进行组织树据的所有行,针对这个name这个列会构建一个新的B+树,但是这个B+树就不会存储这一行完整的数据,而是存储相应的主键id,此时通过name进行查询,来到叶子结点不会得到整个完整的数据信息,而是得到相应的主键id,然后通过主键id再去另一个B+树查询一次得到完整的数据,这就是回表的过程,这个过程是MySQL自动完成的,用户感知不到. 


上述就是对MySQL为什么使用B+树作为索引的总结,希望能够对各位读者有所帮助.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/504689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工业4.0,无代码改变软件开发格局,数字化转型不再寸步难行

从工业1.0时代到工业4.0时代,我们已经看到了,中国在不断发展的过程中,面临着很多的挑战,企业也面临着很多的困难。在这样的大背景下,传统的开发方式已经不再适用了。很多企业开始寻求一种新的方式来开发软件&#xff0…

【场景削减】基于DBSCAN密度聚类风电-负荷确定性场景缩减方法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

1688阿里巴巴中国站图片识别商品API接口、搜图链接、收藏加购接口

API(Application Programming Interface) 是现代移动应用程序开发和互联网服务有机结合的产物。API的应用使得应用程序之间的通信变得更加轻松、快捷,尤其对于业务复杂而庞大的企业系统,API让开发者能够从中提取必要的功能进行二次…

图表控件Stimulsoft 2023.2 带来极致深色主题, 一起来看看还有哪些亮点?

Stimulsoft Reports 是一款报告编写器,主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署,如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等,在你的应用程序中嵌入报告设计器…

IS215UCVEH2AB有助于在更远距离传输电力的同时实现更好的转换效率。

​ IS215UCVEH2AB有助于在更远距离传输电力的同时实现更好的转换效率。 根据法拉第电磁感应定律,当交变磁场作用于具有磁性的材料时,材料中会感应出电动势。 由于导电材料的磁性,EMF 的电流围绕磁性材料主体旋转。这种旋转电流称为涡流。当导…

相交链表问题

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后&…

java版spring cloud 企业电子招投标采购系统源码之首页设计

随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审计监督要…

通过MyBatis(下)

作者:~小明学编程 文章专栏:spring框架 格言:热爱编程的,终将被编程所厚爱。 目录 对MyBatis进行单元测试 springboot的单元测试 生成单元测试类 MyBatis中的增删查改 增 删 查 改 ${} 和 #{} 的区别 SQL注入 模糊查询…

低版本CUDA安装/多版本切换/用户级CUDA安装

前言:我想要安装Torch V1.7.1,根据版本信息只有cuda10.2和11.0。但是,本地安装的CUDA版本为11.6和11.2,都不能满足需求。因此需要降低CUDA版本为10.2 本机系统信息 CUDA版本和显卡驱动 nvidia-smi目前CUDA版本为11.6&#xff0c…

7万字省级智慧农业大数据平台项目规划建设方案

1.1 系统总体结构和逻辑结构 XX市智慧农业项目数据中心是全省数据处理加工和数据分析应用的中心,总体上需实现上连省农业厅、下连各级农业、外连市级部门;构建资源整合、互联互通、资源共享的全省统一的数据中心资源库;构建完善的底层支撑平…

Excel常用快捷键,你也可以成为大家口中的大神

掌握复制、粘贴,相信每个职场人都能骄傲地说“自己熟练使用Excel”,果真如此不害臊吗?不出10秒钟,肯定被面试官问得哑口无言。快捷键太多,记住几个常用的,收藏起来,需要的时候过来查看。 “学E…

软考高级架构师-1计算机硬件

目录 1. 前言 & 更新2. CPU组成3.存储器4. 总线1. 前言 & 更新 计算机硬件章节19-21年没考过,在22年真题考过磁盘调度,根据趋势分析,以后考的概率也不大,了解即可。 本节删掉了第一版中的编码、海明码等内容。 2. CPU组成 计算机的基本硬件系统由控制器、运算器…

日常节省 30%计算资源:阿里云实时计算 Flink 自动调优实践

摘要:本文整理自阿里云开发工程师,Apache Flink Contributor 钟旭阳,在 Flink Forward Asia 2022 生产实践的分享。本篇内容主要分为四个部分: 1. 历史背景 2. 框架简介 3. 案例介绍 4. 未来规划 Tips:点击「阅读原文」…

粘包/拆包问题一直都存在,只是到TCP就拆不动了。

• OSI open-system-Interconnection• TCP/IP 5层协议栈 • 应用层和操作系统的边界是 系统调用 ,对应到网络编程是socket api• TCP/UDP 概况• TCP粘包问题• 结合TCP/IP报头再回顾,柳暗花明 OSI开放系统互联 定义了网络框架,以层为单位实…

【VSLAM】ORB-SLAM3安装部署与运行

心口如一,犹不失为光明磊落丈夫之行也。——梁启超 文章目录 :smirk:1. ORB-SLAM3介绍:blush:2. 代码安装部署1. 安装ros与opencv2. 安装Pangolin作为可视化和用户界面3. 安装Eigen3一个开源线性库,可进行矩阵运算4. 安装ORB-SLAM3 :satisfied:3. 案例运…

OpenHarmony开发者大会正式召开 百业齐鸣开源共兴​

4月19日,OpenHarmony 开发者大会于北京正式召开。此次会议以“开源正当时,共赢新未来”为主题,邀请了各行各业众多开发者与会,盛况非凡。据了解,此次大会由开放原子开源基金会指导,OpenHarmony 项目群工作委…

依赖引入手册Idea常用设置常用工具手册

目录 数据库相关web应用工具相关postmancanal 测试相关插件相关Idea相关 数据库相关 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <!--连接池-->…

进程控制(上)

目录 &#xff1a; 1.fork&#xff08;&#xff09;写实拷贝 -- 缺页中断 2.进程终止 1.退出码 2.exit&#xff08;进程终止&#xff09;、_exit() 3.进程等待 1.进程等待的必要性 2.进程如何进入等待 -----------------------------------------------------------------…

MySQL常见的存储引擎

InnoDB&#xff1a;InnoDB是一种兼顾高可靠性和高性能的通用存储引擎&#xff0c;在MySQL 5.5之后&#xff0c;InnoDB是默认的MySQL存储引擎。 特点&#xff1a;1、DML操作遵循ACID模型&#xff0c;支持事务; 2、行级锁&#xff0c;提高并发访问性能; 3、支持外键FOREIGN KEY约…

爬虫框架有Scrapy、BeautifulSoup、Selenium

爬虫框架有Scrapy、BeautifulSoup、Selenium BeautifulSoup比Scrapy相对容易学习。Scrapy的扩展&#xff0c;支持和社区比BeautifulSoup更大。Scrapy应被视为蜘蛛&#xff0c;而BeautifulSoup则是Parser。 1.爬虫基础知识 在开始Python爬虫之前&#xff0c;需要先掌握一些基础知…