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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 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树,每个节点都可能查找到数据,需要在叶子节点和内部节点不停的往返移动,所以不稳定。
      相关实践学习
      如何在云端创建MySQL数据库
      开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
      全面了解阿里云能为你做什么
      阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
      目录
      相关文章
      |
      1月前
      |
      存储 关系型数据库 MySQL
      一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
      一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
      |
      2月前
      |
      存储 缓存 关系型数据库
      |
      1天前
      |
      存储 SQL 关系型数据库
      mysql 的ReLog和BinLog区别
      MySQL中的重做日志(Redo Log)和二进制日志(Binary Log)是两种重要的日志系统。重做日志主要用于保证事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务更改。二进制日志则记录了数据库的所有逻辑变化操作,用于数据的复制、恢复和审计。两者在写入时机、存储方式、配置参数和使用范围上有所不同,共同确保了数据库的稳定性和可靠性。
      |
      2月前
      |
      存储 Oracle 关系型数据库
      Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
      从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
      414 18
      Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
      |
      1月前
      |
      存储 SQL 关系型数据库
      mysql中主键索引和联合索引的原理与区别
      本文详细介绍了MySQL中的主键索引和联合索引原理及其区别。主键索引按主键值排序,叶节点仅存储数据区,而索引页则存储索引和指向数据域的指针。联合索引由多个字段组成,遵循最左前缀原则,可提高查询效率。文章还探讨了索引扫描原理、索引失效情况及设计原则,并对比了InnoDB与MyISAM存储引擎中聚簇索引和非聚簇索引的特点。对于优化MySQL性能具有参考价值。
      |
      2月前
      |
      存储 关系型数据库 MySQL
      MySQL 为什么使用 B+ 树作为索引结构?
      MySQL 为什么使用 B+ 树作为索引结构?
      91 2
      |
      1月前
      |
      存储 JSON 关系型数据库
      MySQL 5.x和MySQL 8.x到底有什么区别?
      本文详细对比了MySQL 5.x与MySQL 8.x的主要区别,包括存储引擎改进、性能提升、SQL语法增强(如窗口函数、CTE、JSON支持)、安全性和权限管理、并发及锁机制、InnoDB引擎增强、复制与高可用性等方面的显著差异。通过具体示例展示了8.x版本在企业级应用和高并发场景下的优越表现,建议有条件时尽早升级至MySQL 8.x以充分利用其新特性。
      |
      1月前
      |
      存储 关系型数据库 MySQL
      Mysql行格式DYNAMIC和COMPACT区别
      总之,选择哪种行格式取决于具体的应用场景,如数据类型分布、读写比例、存储与性能需求等。在处理大量文本或二进制数据且对存储空间敏感的应用中,DYNAMIC格式可能是更好的选择;而对于混合型数据且对读取性能有一定要求的场景,COMPACT格式可能更合适。在设计数据库时,评估这些因素并进行适当测试,可以帮助确定最适合的行格式。
      85 0
      |
      3月前
      |
      SQL 关系型数据库 MySQL
      Mysql中from多表跟join表的区别
      Mysql中from多表跟join表的区别
      201 0
      |
      3月前
      |
      关系型数据库 MySQL
      Mysql中count(1)、count(*)以及count(列)的区别
      Mysql中count(1)、count(*)以及count(列)的区别
      42 0