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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 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
      目录
      相关文章
      |
      3天前
      |
      存储 缓存 关系型数据库
      |
      12天前
      |
      存储 关系型数据库 MySQL
      ES的全文索引和MySQL的全文索引有什么区别?如何选择?
      【8月更文挑战第26天】ES的全文索引和MySQL的全文索引有什么区别?如何选择?
      58 5
      |
      22天前
      |
      前端开发 关系型数据库 MySQL
      com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别
      这篇文章讨论了`com.mysql.jdbc.Driver`和`com.mysql.cj.jdbc.Driver`两个MySQL驱动类的区别,指出`com.mysql.jdbc.Driver`适用于MySQL 5的`mysql-connector-java`版本,而`com.mysql.cj.jdbc.Driver`适用于MySQL 6及以上版本的`mysql-connector-java`。文章还提到了在实际使用中如何根据MySQL版本选择合适的驱动类。
      com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别
      |
      27天前
      |
      存储 SQL 关系型数据库
      OceanBase与MySQL有何区别?
      【8月更文挑战第12天】OceanBase与MySQL有何区别?
      41 3
      |
      28天前
      |
      存储 关系型数据库 MySQL
      "揭秘!MySQL为何独宠B+树?跳表再牛,也敌不过这性能王者的N重诱惑!"
      【8月更文挑战第11天】MySQL作为主流关系型数据库,优选B+树而非跳表作为索引结构,基于其对范围查询的支持、低磁盘I/O开销及事务处理能力。B+树叶节点构成有序链表,利于范围查询;较矮的树形结构减少了磁盘访问次数;支持多版本并发控制,保障事务ACID特性。而跳表在线性扫描范围查询时效率低,难以高效实现事务管理,且额外指针增加空间消耗。示例代码展示了B+树节点分裂过程,突显其内部机制。综上,B+树为MySQL提供了高性能、可靠的数据存储与检索能力。
      33 4
      |
      29天前
      |
      存储 关系型数据库 MySQL
      MySQL为何偏爱B+树而非跳表?
      【8月更文挑战第9天】在数据库的世界里,索引是提升查询效率的关键。而在MySQL这样的关系型数据库管理系统中,B+树作为索引结构的首选,其背后的原因值得我们深入探讨。本文将从技术角度解析,为何MySQL选择B+树而非跳表作为其索引结构的核心。
      89 1
      |
      10天前
      |
      SQL 关系型数据库 MySQL
      Mysql中from多表跟join表的区别
      Mysql中from多表跟join表的区别
      33 0
      |
      12天前
      |
      关系型数据库 MySQL
      Mysql中count(1)、count(*)以及count(列)的区别
      Mysql中count(1)、count(*)以及count(列)的区别
      23 0
      |
      14天前
      |
      关系型数据库 MySQL 数据库
      MySQL MVCC和间隙锁有什么区别?
      【8月更文挑战第24天】MySQL MVCC和间隙锁有什么区别?
      31 0
      |
      2月前
      |
      SQL 关系型数据库 MySQL
      MySQL删除表数据、清空表命令(truncate、drop、delete 区别)
      MySQL删除表数据、清空表命令(truncate、drop、delete区别) 使用原则总结如下: 当你不需要该表时(删除数据和结构),用drop; 当你仍要保留该表、仅删除所有数据表内容时,用truncate; 当你要删除部分记录、且希望能回滚的话,用delete;

      热门文章

      最新文章

      下一篇
      DDNS