首页 > 数据库 >MySQL为什么使用B+树以及什么是覆盖索引和回表

MySQL为什么使用B+树以及什么是覆盖索引和回表

时间:2024-09-28 21:55:04浏览次数:3  
标签:存储 查询 回表 索引 MySQL 数据 节点

目录

B+树

什么是B+树

B+树的特性

        节点有序性

        数据聚集性

        查询稳定性

        高扇出性

MySQL为什么选择B+树

        从范围查询的角度

        从插入和删除的角度

        从磁盘I/O的角度

什么是回表和覆盖索引

        回表

        覆盖索引

最后

 

        在开搞MySQL为什么使用B+树之前,我们先来简单了解一下B+树到底是什么。

B+树

        什么是B+树

        B+树简单来说就是一种自平衡的多叉树形数据结构,自平衡就是说它的左右高度差不超过1,多叉的意思就是它的每一个非叶子结点都可以有多个节点,我把它简单理解成有多只手,可以伸到很多地方,二叉树就像一个人一样,只有两只手,多叉树就像千手观音一样,可以有很多只手。

        B+的所有数据都存储在叶子节点,非叶子结点只存储键值和子节点的指针,叶子节点直接通过指针相互连接,形成一个有序链表,这个有序链表使得B+树在范围查询上有很大的优势,每个节点可以存储多个键值,键值之间是有序的。

        简单说完B+树是什么鬼东西,接下来我们来简单了解一下B+树的特点。

        B+树的特性

        节点有序性

        B+树的节点内部的键值和叶子节点的数据都是有序的,这让B+树可以高效的进行范围查询。

        数据聚集性

        B+树的数据全部存储在叶子节点,且叶子节点之间通过指针相连,形成有序的链表结构,数据在物理存储层面是聚集的,有利于提高查询的效率。

        查询稳定性

        由于B+树多叉、一个节点可以存储多个键值,只在叶子节点存储数据的特点,使得B+树的高度一般较低,就像个矮胖子一样(身高1米五,体重二百五),所以B+树即使存储的数据量急剧的不断的增大,B+树的查询性能也不会受到太大的影响。

        高扇出性

        B+树的每个节点可以存储大量键值,每个键值又指向了一个子节点,使得B+树能存储的数据量及其庞大,同时还极大的减低了树的高度。

        我们都知道,数据一般都是存储在磁盘中的,磁盘扇区是磁盘最小的数据存储单位,B+树低高度和数据量大集中的特点,使得一个扇区之中可以存储大量的数据或者指引我们找到数据的键值,通过B+树查询一个数据时,可以通过较少的磁盘I/O的次数完成查询。

        我对高扇出性的理解就是小扇区高产出,或者说小扇区高效率(不知道我的理解对不对,如果大家有其他看法的,也可以留言跟我分享一下)。

        简单的介绍完B+树的特性之后,我们终于可以来回答标题的前半部分——MySQL为什么选择B+树了。

MySQL为什么选择B+树

        从范围查询的角度

        我们平时使用MySQL的时候,经常要用到等值查询和范围查询,等值查询就不用多说了,而范围查询就不是什么数据结果都能很好的适配的了。

        上面我们介绍了,B+树的数据全都存储的叶子节点,且叶子节点直接通过指针相连形成有序链表,天然适合范围查询。MySQL的Innodb存储引擎(我们常用的那个)的B+树使用双向链表来连接存储在叶子节点中的数据,使得通过B+树进行范围查询的时候,既可以往前探探头看看是不是我要的数据,也可以往后踢一脚,看看是不是我要的数据。

        如果大家了解过B数和二叉树,还可以发现B+树的另一个优点。那就是B+树不用回到根节点再从根节点跑到叶子节点来进行范围查询,通过横向的指针使得它可以横向的直接进行范围查询。

        从插入和删除的角度

        B+树上有大量的冗余节点(所有的非叶子节点都是冗余节点),这些冗余的节点使得B+树在插入和删除操作的时候,树的结构不会发生太过复杂的变化,效率更高,如果是什么AVL树、B树啥的,很大可能还要进行树的左旋右旋等操作来改变树的结构来维持自平衡和数据索引之间的顺序,大大降低了数据库的效率。

        从磁盘I/O的角度

        MySQL的数据是持久化在磁盘的,树的高度决定了磁盘I/O的次数,由于磁盘是一个很慢的存储设备,因此磁盘I/O的次数在很大程度上决定了MySQL的查询性能。

        B+树的非叶子节点不存放数据,相比于B树等其它数据结构,能够存储更多的索引和数据,因此B+树相比于其他数据结构更加"矮胖",就非常符合mysql对低磁盘I/O的提高数据查询速度的需求。

        搞定完MySQL为什么选择B+树,最后我们再来简单的介绍两个有意思的概念——回表和覆盖索引。

什么是回表和覆盖索引

        回表

        当一个查询语句使用到二级索引进行查询时,如果二级索引树里不包含查询语句所需的所有字段,则MySQL会在二级索引树上查询到所需数据的主键索引后,到主键索引树中查询所需的数据字段。这个从二级索引查主键索引,再通过主键索引查询数据的过程就叫做回表;

        覆盖索引

        如果二级索引树中的数据能够满足查询语句所需的所有字段,则MySQL直接使用二级索引中的数据返回给客户端,不需要再去主键索引树中获取数据,这个直接从二级索引拿到数据返回的过程就叫做覆盖索引。

        从上面的回表和覆盖索引的描述中,我们可以得出一个结论:如果只使用二级索引就查到所需数据的情况,就是覆盖索引;使用二级索引树后还需要到主键索引树中取数据的情况,就是回表。

最后

        最后,谢谢大家看完我的文章,前面的MySQL为什么选择B+树和最后的回表和覆盖索引,一个我觉得很杂但比较枯燥,一个我觉得很简短但很有意思,我就把它们放一起了,看似没什么逻辑上的关系,其实本来就没有。

        哈哈哈哈哈哈哈哈哈。拜拜啦各位,我去吃夜宵了。祝大家,学习的学啥都会,工作的很快就能升职加薪。溜了溜了~

 

标签:存储,查询,回表,索引,MySQL,数据,节点
From: https://blog.csdn.net/2301_79318558/article/details/142602463

相关文章

  • MySQL 之多表设计详解
    在实际应用场景中,我们经常需要处理包含多种数据实体及其之间复杂关系的业务逻辑,例如电商平台的用户、商品、订单,社交网络的用户、帖子、评论等等。如果将所有数据都堆砌在一张表中,不仅会造成数据冗余、难以维护,还会严重影响查询效率。为了解决这些问题,我们需要采用多表设计,即......
  • MySQL 数据类型详解
    在MySQL数据库中,数据类型的选择对性能和存储效率有着至关重要的影响。选择正确的数据类型可以最大限度地利用资源,并提高查询速度。一、数值类型详解数值类型用于存储数字数据,根据数据范围和精度需求,MySQL提供多种整数和浮点数类型。1.整数类型类型大小(字节)范围性能用途......
  • MySQL安全加固
    安装mysql下载地址:http://dev.mysql.com/get/Downloads/MySQL-5.6/mysq1-5.6.33-linux-glibc2.5x86_64.tar.gz解压:tar-zxvfmysql-5.6.33-linux-glibc2.5-x86_64.tar.gz复制解压后的mysql目录:cp-rmysql-5.6.33-linux-glibc2.5-x8664/usr/local/mysql添加用户组groupaddmysql......
  • MySQL 中的 FOREIGN KEY 约束:确保数据完整性的关键
    在MySQL数据库中,FOREIGNKEY(外键)约束是一种非常重要的机制,它可以帮助我们确保数据的完整性和一致性。那么,FOREIGNKEY约束究竟是什么呢?让我们一起来深入了解一下。一、什么是FOREIGNKEY约束?FOREIGNKEY约束是一种用于建立两个表之间关系的约束。它通过在一个表中定义一个......
  • MySQL 性能剖析全攻略
    在使用MySQL数据库的过程中,性能问题往往是让开发者和管理员头疼的难题。为了有效地解决这些问题,我们需要对MySQL进行性能剖析。那么,如何在MySQL中进行性能剖析呢?本文将为你详细介绍。一、为什么要进行性能剖析?MySQL数据库在运行过程中,可能会出现各种性能问题,如查询速度慢......
  • ELK日志收集之ES基础概念及索引增删改查别名
    一、ES核心基本术语集群(Cluster):由一个或多个节点组成的网络,共同提供索引和搜索功能。每个集群都有一个唯一的集群ID。#查看集群名字和UUIDcurl-XGET"localhost:9200"节点(Node):构成集群的基本单元,每个节点都有一个唯一的ID,并且可以存储数据。#查看所有节点信息curl-XGET"......
  • 精通推荐算法31:行为序列建模之ETA — 基于SimHash实现检索索引在线化
    1 行为序列建模总体架构2SIM模型的不足和为什么需要ETA模型SIM实现了长周期行为序列的在线建模,其GSU检索单元居功至伟。但不论Hard-search还是Soft-search,都存在如下不足:GSU检索的目标与主模型不一致。Hard-search通过类目属性来筛选历史行为,但不同类目不代表相关度低,比......
  • MySQL数据库基础
    一.知识框架一开始学数据库,我们要先大致了解一下整个体系是怎么样的,搭建起一个知识体系,方便记忆和学习。什么是数据库,由名可知,就是保存用户数据的程序就是数据库,那MySQL又是什么呢,其实MySQL就是一个应用软件,通过这个应用软件就可以创建数据库,能够对数据库进行增删查改等一系......
  • mysql 锁 记录
     表级别锁1.表锁locktablesxxread. 线程只能读locktablesxxwrite其他线程无法读写  2.MDL锁(元数据锁 MDL是为了对表执行CRUD操作时,防止其他线程对这个表结构做了变更,反之亦然注意 MDL是在事务提交后才会释放,因此长事务可能导致修改表操作阻塞  ......
  • ElasticSearch倒排索引
    一、ElasticSearch基本概念        Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsear......