Mysql 为什么使用 B+Tree 作为索引结构

常规的数据库存储引擎,一般都是采用 B 树或者 B+树来实现索引的存储。
因为 B 树是一种多路平衡树,用这种存储结构来存储大量数据,它的整个高度会相比二叉树来说,会矮很多。
而对于数据库来说,所有的数据必然都是存储在磁盘上的,而磁盘 IO 的效率实际上是很低的,特别是在随机磁盘 IO 的情况下效率更低。
所以树的高度能够决定磁盘 IO 的次数,磁盘 IO 次数越少,对于性能的提升就越大,这也是为什么采用 B 树作为索引存储结构的原因。
但是在 Mysql 的 InnoDB 存储引擎里面,它用了一种增强的B 树结构,也就是B+树来作为索引和数据的存储结构。
相比较于 B 树结构,B+树做了几个方面的优化。

  1. B+树的所有数据都存储在叶子节点,非叶子节点只存储索引。
  2. 叶子节点中的数据使用双向链表的方式进行关联。
    使用 B+树来实现索引的原因,我认为有几个方面。
  3. B+树非叶子节点不存储数据,所以每一层能够存储的索引数量会增加,意味着B+树在层高相同的情况下存储的数据量要比 B 树要多,使得磁盘 IO 次数更少。
  4. 在 Mysql 里面,范围查询是一个比较常用的操作,而 B+树的所有存储在叶子节点的数据使用了双向链表来关联,所以在查询的时候只需将两个节点进行遍历就行,而B 树需要获取所有节点,所以B+树在范围查询上效率更高。
  5. 在数据检索方面,由于所有的数据都存储在叶子节点,所以 B+树的IO 次数会更加稳定一些。
  6. 因为叶子节点存储所有数据,所以 B+树的全局扫描能力更强一些,因为它只需要扫描叶子节点。但是 B 树需要遍历整个树。
    另外,基于 B+树这样一种结构,如果采用自增的整型数据作为主键,还能更好地避免增加数据的时候,带来叶子节点分裂导致的大量运算的问题。
    总的来说,我认为技术方案的选型,更多的是去解决当前场景下的特定问题,并不一定是说B+树就是最好的选择,就像 MongoDB 里面采用 B 树结构,本质上来说,其实是关系型数据库和非关系型数据库的差异。

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

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

相关文章

Pixverse:开启文生视频与图生视频新纪元

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

在桐乡 CAD必须学会的基本知识

CAD必须学会的基本知识 一说到CAD,跑到大街上问下,会不会这个软件?保证一大批人都说会,但是,大多数人都其实只是会了点简单的东西!抄个图没什么问题,但是如果遇到复杂的产品或者图纸&#xff0…

Python反爬突破Cloudflare5秒盾的处理

最近爬一个网站,遇到了个很棘手的问题,网页访问正常,查看网页源码内容能看到想要的信息,但是用python去爬的话就会遇到反爬Cloudflare 5秒盾的检测,返回各种比如Just a moment…等等的结果,最后用了两种方法…

Python基础02-掌握HTTP API的秘诀

在下面文案基础上扩展,写一篇技术博客,标题要有吸引力? 标题: 在Python中,使用HTTP API已成为一种常见的操作。本文将深入探讨如何使用Python的requests库与HTTP API进行交互。我们将学习如何发送GET和POST请求、处理…

java:代理模式

代理模式 动态代理是一种在运行时生成代理对象的机制,通过代理对象可以在不修改原始对象的情况下,对其进行额外的操作和增强. 被代理对象就是豌豆射手 代理角色就是火炬树桩 动态代理的使用场景 AOP(Spring框架技术): 动态代理可以在不修改原始代码的情况下,通过拦截方法…

怎么使用Python提取快递信息

目录 一、前言 二、准备工作 三、安装必要的库 四、编写代码 导入必要的库 定义快递查询函数 调用快递查询函数 五、进阶操作 定时查询快递信息 发送快递信息通知 六、注意事项 一、前言 在提取快递信息之前,我们需要了解快递查询的基本原理。大部分快递…

apache是什么

​Apache(音译为阿帕奇)是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译…

ARouter之kotlin build.gradle.kts

ARouter之kotlin build.gradle.kts kotlin的配置需要用到kapt 项目的build.gradle.kts plugins {id("com.android.application") version "8.1.2" apply falseid("org.jetbrains.kotlin.android") version "1.9.0" apply falseid(&…

使用 Qt 设计师给工具栏添加图片按钮(来自ChatGPT)

使用Qt Designer给工具栏添加图片按钮是一个直观且简单的过程。下面是详细步骤: 打开Qt Designer 并创建或打开一个已有的窗口界面文件(通常以.ui结尾)。 添加工具栏(如果尚未添加):如果主窗口没有工具栏&…

亚马逊云挂机项目,单机600+,详细拆解

一、什么是亚马逊云挂机项目? 此项目有很多种叫法,也有人叫它亚马逊店铺挂机浏览项目。 二、赚钱原理? 新入驻的亚马逊商家往往是没有流量和曝光的,为了让店铺的商品更多的被人看到,花钱在平台直接买流量又不划算&a…

第2章 基本概念

第2章 基本概念 1. 学习笔记2. 书后练习问题4问题7问题8问题11编程练习2 1. 学习笔记 三字母词(trigraphs),就是三个连续的字符合起来表示另一个字符。三字母词使C环境可以在某些缺少一些必须字符的字符集上实现。虽然trigraphs曾经在C语言的…

pyqt5 QLabel显示网络图片

分享一个QLabel显示网络图片的方。 看网上基本都是使用requests来请求的,这会有个问题如果将请求放入主线程页面会直接卡死,那么肯定pass,如果将请求放入QThread中,网络图片只有10~20个还可以凑合,如果需要加载上百个网…

Vue 3 项目构建与效率提升:vite-plugin-vue-setup-extend 插件应用指南

一、Vue3项目创建 前提是已安装Node.js(点击跳转Node官网) npm create vuelatest这一指令将会安装并执行 create-vue,它是 Vue 官方的项目脚手架工具。你将会看到一些诸如 TypeScript 和测试支持之类的可选功能提示: ✔ Projec…

2024-03-23青少年软件编程(Python语言)等考(一级)解析

2024-03-23青少年软件编程(Python语言)等级考试试卷(一级)解析一、单选题(共25题,共50分) 1.下列哪个命令,可以将2024转换成2024 呢?( A ) A. str(2024) B. int(2024) C. float(2024) D. bool(2024)将数字转换成字符串用到的是str() 语句。 2.猴子摘了一包桃子,第一…

WPS的bug问题(解决方法->换成office吧):表格数据和透视图数据不一致问题,多次尝试确定该bug

1.软件版本 2.问题描述 我在原始表中对其中一列进行筛选,选择95%以上这个选项值,343个数据。 在筛选了95%以上这个选项之后,我的另一列的值全部是no,343个数据。 然后进行透视图之后,在绘制的图形中发现&#xff0c…

腾讯面试准备-2024.3.25

腾讯面试准备-2024.3.25 腾讯面试准备-2024.3.25自我介绍C11/14/17新特性C11新特性C14新特性C17新特性 struct和class的区别进程状态现代的流媒体通信协议栈流媒体协议详解extern "C"程序从编译到执行的过程进程、线程、协程进程线程协程 如何实现一个信号与槽系统&a…

Linux错误(3)Linux里IP套接字sendmsg出现EPERM错误

Linux错误(3)之Linux里IP套接字sendmsg出现EPERM错误 Author: Once Day Date: 2024年2月21日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Mermaid使用指南_Once_day的博客-CSDN博客 参考文档: c - How to fix EPERM error when trying to use sendto() with Ethernet so…

2024_GAMES101作业环境配置Mac(intel)_VSCode_Clion

目录 VSCodeClionCMakeList.txt VSCode brew install cmake 更换下载源为阿里云下载 opencv,不然会很慢 cd "$(brew --repo)" git remote -v cd "$(brew --repo)" git remote set-url origin https://mirrors.aliyun.com/homebrew/brew.git…

linux中 关于操作Tomcat、Apache、Nginx、Mysql 的操作命令

a. 控制Apache 的操作命令 # 启动Apache命令 service httpd start # 重新 启动Apache命令 service httpd restart # 停止Apache命令 service httpd stop # 启动Apache命令 service httpd statusb. 控制Tomcat的操作命令 # 启动Tomcat命令 sh startup.sh# 停止Tomcat命令 s…

Ubuntu 24.04 LTS (Noble Numbat) 下载

Ubuntu 24.04 LTS (Noble Numbat) 下载 Ubuntu 24.04 LTS 开启 Beta 测试, 正式版即将发布 请访问原文链接:Ubuntu 24.04 LTS (Noble Numbat),查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Ubuntu 24.04 LTS 首个…