MySQL B+树相对于B树的区别及优势:

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: MySQL B+树相对于B树的区别及优势:

部分参考:B树和B+树的区别

MySQL为什么使用树结构?

    1. 文件很大,不可能全部存储在内存中,故要存储到磁盘上
    2. 索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(为什么使用B-/+Tree,还跟磁盘存取原理有关)
    3. 局部性原理与磁盘预读,预读的长度一般为页(page)的整倍数(操作系统内存页的大小通常为4k)。其中MySQL B+树中的 叶/非叶节点 都是以MySQL的页为单位(大小通常也为16k),存放完整行记录。
    4. 数据库系统巧妙利用了磁盘预读原理,将一个节点大小设为操作系统内存页的整数倍,这样每个节点只需要一次I/O就可以完全载入。而红黑树这种结构,高度明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性。

    参考:磁盘读取

           计算机系统是分页读取和存储的,一般一页为4KB(8个扇区,每个扇区512B,8*512B=4KB),每次读取和存取的最小单元为一页,而磁盘预读时通常会读取页的整倍数。

           根据文章上述的【局部性原理】①当一个数据被用到时,其附近的数据也通常会马上被使用。②程序运行期间所需要的数据通常比较集中。由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),所以即使只需要读取一个字节,磁盘也会读取一页的数据。

           MySQL InnoDB默认的页大小为16k(可通常 innodb_page_size 参数设置),而操作系统中的磁盘页大小通常为4k,所以这里可以认为MySQL InnoDB中的1页(1个磁盘块)相当于操作系统中的4页。

           这也就符合MySQL InnoDB所利用到的磁盘预读通常会预读操作系统页的整数倍(4倍)。具体如下图:

    image.gif编辑

          最外层浅蓝色磁盘块1里有数据17、35(深蓝色)和指针P1、P2、P3(黄色)。P1指针表示小于17的磁盘块,P2是在17-35之间,P3指向大于35的磁盘块。真实数据存在于叶子节点也就是最底下的一层3、5、9、10、13......非叶子节点不存储真实的数据,只存储指引搜索方向的数据项,如17、35。

         查找过程:例如搜索28数据项,首先加载磁盘块1到内存中,发生一次I/O,用二分查找确定在P2指针。接着发现28在26和30之间,通过P2指针的地址加载磁盘块3到内存,发生第二次I/O。用同样的方式找到磁盘块8,发生第三次I/O。

         真实的情况是,上面3层的B+Tree可以表示2k万的数据,这种量级的数据只发生了三次I/O,时间提升是巨大的。

    B树和B+树的区别:

      1. B树的每个节点都存储了key和data,而B+树的data存储在叶子节点上。
        B+树非叶子节点仅存储key不存储data这样一个节点就可以存储更多的key。可以使得B+树相对B树来说更矮(IO次数就是树的高度),所以与磁盘交换的IO操作次数更少。
      2. B+树所有叶子节点构成一个有序链表,按主键排序来遍历全部记录,能更好支持范围查找
        由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历,相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。
      3. B+树所有的查询都要从根节点查找到叶子节点,查询性能更稳定;而B树,每个节点都可能查找到数据,需要在叶子节点和内部节点不停的往返移动,所以不稳定。
      相关实践学习
      每个IT人都想学的“Web应用上云经典架构”实战
      本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
      MySQL数据库入门学习
      本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
      目录
      相关文章
      |
      6月前
      |
      存储 关系型数据库 MySQL
      MySQL中的int(10)、char(10)与varchar(10)的类型和区别
      在选择正确的数据类型时,需要仔细考虑每列的数据特点及应用程序的使用情况。合理的数据类型选择可以优化存储空间的使用,提高查询速度和数据库的整体性能。
      665 14
      |
      7月前
      |
      存储 关系型数据库 MySQL
      MySQL数据库中的 char 与 varchar的区别是什么
      MySQL中的char和varchar均用于存储字符串,但有显著区别。char为定长类型,固定长度,存储空间始终为设定值,适合长度固定的数据如手机号。varchar为变长类型,仅占用实际数据所需空间,适合长度不固定的内容如用户名。二者在性能与空间利用上各有优劣,应根据实际场景合理选择。
      504 0
      |
      存储 SQL 关系型数据库
      mysql 的ReLog和BinLog区别
      MySQL中的重做日志和二进制日志是确保数据库稳定性和可靠性的关键组件。重做日志主要用于事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务;而二进制日志记录SQL语句的逻辑变化,支持数据复制、恢复和审计。两者在写入时机、存储方式及配置参数等方面存在显著差异。
      299 6
      |
      存储 缓存 关系型数据库
      【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
      MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
      2208 57
      【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
      |
      SQL Oracle 关系型数据库
      MySQL 和 Oracle 的区别?
      本文对比了Oracle和MySQL数据库的多个方面。Oracle适用于大型数据库,支持高并发和大访问量,市场占有率为40%,安装占用空间较大,约3G;而MySQL适合中小型应用,是开源免费的,安装仅需152M。两者在主键生成、字符串处理、SQL语句、事务处理等方面存在差异。Oracle功能更为强大,尤其在企业级应用中表现突出,而MySQL则以简单易用见长。
      1416 7
      MySQL 和 Oracle 的区别?
      |
      12月前
      |
      存储 关系型数据库 MySQL
      MYSQL支持的存储引擎有哪些, 有什么区别
      MYSQL存储引擎有很多, 常用的就二种 : MyISAM和InnerDB , 者两种存储引擎的区别 ; ● MyISAM支持256TB的数据存储 , InnerDB只支持64TB的数据存储 ● MyISAM 不支持事务 , InnerDB支持事务 ● MyISAM 不支持外键 , InnerDB支持外键
      |
      SQL 存储 关系型数据库
      简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
      在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
      1516 0
      |
      存储 关系型数据库 MySQL
      MySQL引擎InnoDB和MyISAM的区别?
      InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
      308 9
      |
      存储 NoSQL 关系型数据库
      MySQL和Redis的区别
      **MySQL和Redis的区别** MySQL和Redis都是流行的数据存储解决方案,但它们在设计、用途和特性上有显著区别。理解这些区别有助于选择合适的数据库来满足不同的应用需求。本文将详细介绍MySQL和Redis的区别,包括它们的架构、使用场景、性能和其他关键特性。 ### 一、基本概述 **MySQL**: MySQL是一个关系型数据库管理系统(RDBMS),使用结构化查询语言(SQL)进行数据管理。它支持事务、复杂查询和多种存储引擎,广泛应用于各种Web应用、企业系统和数据分析项目。 **Redis**: Redis是一个基于内存的键值数据库,通常被称为NoSQL数
      847 4
      |
      存储 关系型数据库 MySQL
      【MYSQL】 ——索引(B树B+树)、设计栈
      索引的特点,使用场景,操作,底层结构,B树B+树,MYSQL设计栈

      推荐镜像

      更多