数据库索引的原理,为什么要用 B+树,为什么不用二 叉树?

news2025/1/16 16:15:48

1、B树和B+树


一般来说,数据库的存储引擎都是采用B树或者B+树来实现索引的存储。首先来看B树,如图所士
在这里插入图片描述

B树是一种多路平衡树,用这种存储结构来存储大量数据,它的整个高度会相比二叉树来说,会矮很多。
而对于数据库而言,所有的数据都将会保存到磁盘上,而磁盘I/O的效率又比较低,特别是在随机磁盘I/O的情况下效率更低。

所以高度决定了磁盘I/O的次数,磁盘I/O次数越少,对于性能的提升就越大,这也是为什么采用B树作为索引存储结构的原因,如图所示。
而MySQL的InnoDB存储引擎,它用了一种增强的B树结构,也就是B+树来作为索引和数据的存储结构。
相比较于B树结构来说,B+树做了两个方面的优化,如图所示。
在这里插入图片描述

  1. B+树的所有数据都存储在叶子节点,非叶子节点只存储索引。
  2. 叶子节点中的数据使用双向链表的方式进行关联。

2、原因分析

MySQL索引结构采用B+树,有以下4个原因:

Mysql索引结构采用B+数的原因:


1、从磁盘I/O效率方面来看:


B+树的非叶子节点不存储数据,所以树的每一层就能够存储
更多的索引数量,也就是说,B+树在层高相同的情况下,比B树的存储数据量更多,间接会减少磁盘I/O的次数。


2、从范围查询效率方面来看:


在MySQL中,范围查询是一个比较常用的操作,而B+树的所有存储在叶子节点的数据使用了双向链表来关联,所以B+树在查询的时候只需查两个节点进行遍历就行,而B树需要获取所有节点,因此,B+树在范围查询上效率更高。


3、从全表扫描方面来看:


因为,B+树的叶子节点存储所有数据,所以B+树的全局扫描能
力更强一些,因为它只需要扫描叶子节点。而B树需要遍历整个树。


4、从自增ID方面来看:


基于B+树的这样一种数据结构,如果采用自增的整型数据作为主键,
还能更好的避免增加数据的时候,带来叶子节点分裂导致的大量运算的问题。

3、总结

总体来说,我认为技术方案的选型,更多的要根据具体的业务场景来决定,并不一定是说B+树就是最好的选择,就像MongoDB里面采用B树结构,本质上来说,其实是关系型数据库和非关系型数据库的差异。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/501198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RFID系统在物流仓储中的应用

RFID系统是一种无线识别技术,最近成为物流仓储行业的热门话题。本文将介绍RFID系统在物流仓储中的应用,包括如何使用RFID标签进行物流管理,如何使用RFID技术提高仓库的安全性,并细述RFID技术在物流仓储中的优势。除此之外&#xf…

ArrayList快速失败机制

文章目录 一、什么是快速失败机制二、例子三、底层原理四、解决方法五、快速失败机制的一个小bug 一、什么是快速失败机制 ArrayList实现了一种称为快速失败(fail-fast)的机制,该机制在并发修改时会抛出ConcurrentModificationException异常。 这种机制的实现原理是:ArrayList…

机器学习案例 | 通过EBG学习概念cup

基于解释的学习(explanation-basedlearning)可简称为解释学习,是20世纪80年代中期开始兴起的一种机器学习方法。解释学习根据任务所在领域知识和正在学习的概念知识,对当前实例进行分析和求解,得出一个表征求解过程的因果解释树,以…

spark2

18Spark中stage的划分 和 shuffle的概念 Stage的划分是根据宽依赖,当触发action算子时,按照从后往前的回溯算法,当遇到会发生shuffle算子的时候,就会切分stage。 Stage的划分本质是shuffle,即当遇到会发生shuffle算子的时…

E. Sergey and Subway(思维 + dp)

Problem - E - Codeforces Sergey Semyonovich 是 N 市县的市长,他一直在思考如何进一步改善 Nkers 的生活。不幸的是,几乎所有可以做的事情都已经完成了,白天他已经没有更多的想法(他现在喜欢在晚上睡觉)。然而&#…

MySQL 中的 distinct 和 group by 的区别

目录 distinct用法distinct多列去重 group by的使用单列去重多列去重 distinct和group by原理隐式排序基于上述原因,Mysql在8.0时,对此进行了优化更新: 结论推荐group by的原因 在语义相同,有索引的情况下:group by和d…

体验 Whisper

体验 Whisper 1. 什么是 Whisper2. Github 地址3. 创建虚拟环境4. 安装 ffmpeg5. 部署 Whisper6. 使用 Whisper 1. 什么是 Whisper Whisper 是一个通用的语音识别模型。它是在一个大型的不同音频数据集上训练出来的,也是一个多任务模型,可以进行多语言语…

MySQL笔记(一):设计范式、基础概念、数据库定义语言DDL

MySQL设计范式、基础概念、数据库定义语言DDL MySQL设计范式、基础概念、数据库定义语言DDL MySQL设计范式、基础概念、数据库定义语言DDL数据模型属性的特点 数据库的创建主键 数据库设计规范第一范式(1NF)第二范式(2NF)第三范式…

智能制造之路-从MES到MOM

当前,中国正在大力推动制造业的转型升级,实现由传统制造向智能制造转型。而制造信息化系统,作为支撑企业实现智能制造的一个关键因素,也正越来越多的吸引企业领导人的关注。 某大型制造业集团企业(下文简称M集团&…

【Java虚拟机】JVM日志分析和可视化工具实操

1.JVM垃圾GC日志参数配置实战 Java虚拟机中垃圾收集器在运行过程中输出的日志信息主要用于分析垃圾收集器的运行状态、优化垃圾收集器的工作效率以及定位垃圾收集相关的问题GC日志会包含以下内容 垃圾收集器的名称和版本信息。垃圾收集器的运行时间、开始时间和结束时间。垃圾…

【Fluent】利用TUI命令在保存或导出文件时,给文件名加上时间步长、流动时间、迭代步数等求解过程变量的自动编码

一、问题背景 在CSDN的一篇博客(从Fluent导出数据到txt文档)中,一位博主分享了一串导出求解数据的TUI命令。 file/export/ascii data%t.txt () yes h2s y-velocity x-velocity q no 当时我不知道里面的%t是啥意思,估计是跟时间…

JMeter介绍与安装教程

简介 JMeter是一款开源的负载测试工具,它可以用于测试Web应用程序、API、数据库、负载均衡器等。JMeter 是由 Apache 软件基金会开发的,其目标是提供一个高性能、易于使用的负载测试工具。 JMeter 具有以下特点: 可扩展性:JMet…

又开发好一个系统,详细记录软著申请过程

经过几个通宵达旦的撸代码之后,又开发好了一个系统,和以往一样,系统开发好了少不了申请软件著作权证书,兄弟们,软著申请搞起来啊。 在版权保护中心后台提交资料,没有账号的需要先注册一个账号。很重要的一步…

停车场收费系统

1.系统的开发工具 1.1 AppServe集成应用 Mysql:MySQL 是一款安全、跨平台、高效的,并与 PHP、Java 等主流编程语言紧密结合的数据库系统。该数据库系统是由瑞典的 MySQL AB 公司开发、发布并支持,由 MySQL 的初始开发人员 David Axmark 和 Mi…

【网络技术】什么是CIDR

序言 世界上最幸福的事之一,莫过于经过一番努力后,所有东西正慢慢变成你想要的样子。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用来标记二级论点 1 基础介…

【设计模式】单例模式(懒汉和饿汉模式详解)

目录 1.设计模式是什么? 2.单例模式 1.概念: 2.如何设计一个单例 1.口头约定(不靠谱) 2.使用编程语言的特性来处理 3.使用"饿汉模式"设计单例 1.详细步骤 2.完整代码 4.使用"饿汉模式"设计单例 1.详…

php+vue在线课程教育学习考试系统864t7

运行环境:phpstudy/wamp/xammp等 开发语言:php 后端框架:Thinkphp5 前端框架:vue.js 服务器:apache 数据库:mysql 数据库工具:Navicat/phpmyadmin功能要求:可以实现首页、个人中心、学生管理、名…

嵌入式软考备考_7 系统开发过程和项目管理

系统开发过程和项目管理 开发模型 把开发过程分成一些阶段。 瀑布模型:SDLC。缺陷在于最开始需求要明确,但是开发周期很难不变动。 因此改进: 原型:一个demo。 快速原型模型:抛弃模型,一旦获取到了用户需…

unity 基本寻径

一、实现效果:敌人追逐玩家,自动躲避障碍物 二、游戏框架 Plane:平面,是玩家和敌人可以行走的区域 Player:玩家,可以在平面上移动,绕开障碍物 Enemy:敌人,可以追逐玩家…

红外遥控且自动避障的嵌入式智能小车系统

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 本次实验使用树莓派作为开发平台,AlphaBot 作为开发载体,Python 作为开发语言,开发一种基于红外线遥控控制的、可自动避障的嵌入式智能小车系统。 智能系统中的嵌入式应用 实验目的 嵌入式…