热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

为什么MySQL数据库索引选择B+树

树是非常重要的一种数据结构,下面先讲几种常见的树结构,并分析它们为什么不适用于数据库索引。AVL树平衡二叉树的定义如下:首先符合二叉查找树的定义,其次必须满足任何节点的两个子节点的

树是非常重要的一种数据结构,下面先讲几种常见的树结构,并分析它们为什么不适用于数据库索引。


AVL树

平衡二叉树的定义如下:首先符合二叉查找树的定义,其次必须满足任何节点的两个子节点的高度差不大于1。平衡二叉树的查找速度确实很快,但是维护一棵平衡二叉树的代价是非常大的,不管我们执行插入还是删除,一旦不满足条件就需要通过左旋和右旋来保持平衡性,所以AVL树适合用于插入删除次数比较少,但查找多的情况。


红黑树

红黑树是一种弱平衡二叉树,相对于AVL树来说它的旋转次数会变少,所以适用于插入删除操作比较频繁的情况。红黑树的五条定义:



  • 所有节点不是红色就是黑色

  • 根节点是黑色

  • 叶子节点是null节点(空节点)且为黑色。

  • 同一路径中,不存在连续的红色节点。

  • 每个节点到它所能到的叶子节点经过的黑色节点数相同。

从根节点到叶子节点的所有路径中,最长路径不会超过最短路径的2倍,这保持了红黑树的弱平衡。在Java中,TreeMap、TreeSet都使用红黑树作为底层数据结构,JDK 1.8开始,HashMap也引入了红黑树:当冲突的链表长度超过8时,自动转为红黑树。


B+树

B+树是为磁盘或其他直接存取辅助设备设计的一种数据结构,在B+树中,非叶子节点相当于是叶子节点的索引,叶子节点才是存储数据的数据层,所有记录都是按键值的大小顺序存放在同一层的叶子结点上,由各叶子结点指针进行连接,B+树的插入必须保证插入后的叶子结点依然有序。(图片来自:https://blog.csdn.net/cxu123321/article/details/105665056/)

所以为什么B+树更适合数据库索引呢?

分析:

数据库的数据一般存储在磁盘中,读取数据时需要访问磁盘,我们知道读取磁盘数据的时间是由磁盘定位的时间+数据读取时间,而且定位的时间要远大于读取的时间,二叉树类型的结构可以将查询速度提升到\(O(log_2 N)\),但是最坏的情况要查找到二叉树的最深层,这在数据量很大时是不能接受的,B+树有高扇出性的特点,所以在这种情况下,矮胖的B+树相比于高瘦的AVL树(或者红黑树)就能减少访问的层数,提升查找效率。在数据库中,B+树的高度一般都在2-4层,这就是说查找某一键值的记录最多只需要2-4次IO。

那为什么采用B+树不用B树呢?

原因:

B树在提高了IO性能的同时并没有解决元素遍历效率低下的问题(B树因为分支结点同样存储着数据,所以如果要查找某个范围的数据,需要进行一次中序遍历)。为了解决这个问题,B+树应用而生,B+树的中间节点存储的只是叶子节点的索引,所有数据都存储在叶子结点中,所以只需要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,B树不支持这样的操作或者说效率太低。

参考:

https://blog.csdn.net/cxu123321/article/details/105665056/



推荐阅读
  • Navicat Premium 15 安装指南及数据库连接配置
    本文详细介绍 Navicat Premium 15 的安装步骤及其对多种数据库(如 MySQL 和 Oracle)的支持,帮助用户顺利完成软件的安装与激活。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • Windows 系统下 MySQL 8.0.11 的安装与配置
    本文详细介绍了在 Windows 操作系统中安装和配置 MySQL 8.0.11 的步骤,包括环境准备、安装过程以及后续配置,帮助用户顺利完成数据库的部署。 ... [详细]
  • 本文详细介绍如何下载并安装MySQL数据库(5.7.10版本),以及配置Navicat管理工具(免费版)。通过本指南,您将了解从下载到安装的完整流程,并掌握基本的数据库管理技能。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
  • 本文探讨了在处理大量物联网设备时,如何合理设计关系型数据库来高效记录设备的上下线历史,确保数据的可维护性和扩展性。 ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
author-avatar
坐看末日之景L_170
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有