MySQL 索引底层 B+Tree 原理解析

news2024/11/19 0:45:10

目录

    • 一、前言
    • 二、B-Tree 和 B+Tree 的区别
    • 三、InnoDB 和 MyISAM 存储引擎索引存储区别
      • MyISAM
      • InnoDB
    • 四、InnoDB 联合索引底层数据结构
    • 五、MySQL 中三次磁盘IO最大能检索多少数据

一、前言

  • 索引是帮助高效获取数据排好序的数据结构,任何数据库都会使用到索引,常用索引数据结构有,二叉树、平衡二叉树、Hash表、红黑树、B-Tree、B+Tree,MySQL中会使用B+Tree,这里会对部分数据结构以及MySQL中是如果存储获取数据的原理进行详细说明。

二、B-Tree 和 B+Tree 的区别

  • B-Tree

    • B-Tree是一种多路二叉树
    • 叶节点具有相同的深度,叶节点的指针为空;
    • 所有索引元素不重复
    • 节点中的数据索引从左到右递增排列
      在这里插入图片描述
  • B+Tree

    • B+Tree是B-Tree的变种
    • 非叶子节点不存储data,只存储索引(冗余),这样可以提升索引查找性能
    • 叶子节点包含所有索引字段
    • 叶子节点用指针连接,提高区间访问的性能
      在这里插入图片描述

B-Tree和B+Tree之间一个很大的不同,是B+Tree的节点上不储存value,只储存key,而叶子节点上储存了所有key-value集合,并且节点之间都是有序的。这样的好处是每一次磁盘IO能够读取的节点更多,也就是树的度(Max.Degree)可以设置的更大一些,因为每次磁盘IO读取的磁盘页数是一定的。例如,每次磁盘IO能够读取1页=4kb,那么省去value的情况下同样一页数据能够读取更多的key,这样就大大减少了磁盘的IO次数。

此外,B+Tree也是排好序的数据结构,数据库中><或者order by等都可以直接依赖这一特性。

MySQL中对于索引使用的主要数据结构也是B+Tree,目的也是在读取数据时能够减少磁盘IO。

三、InnoDB 和 MyISAM 存储引擎索引存储区别

MyISAM

  • 在MyISAM储存引擎中,数据和索引文件试试分开储存的,数据存在 表名.MYD 的文件中,索引单独存在 表名.MYI 的文件中。
    在这里插入图片描述

  • MyISAM索引文件和数据文件是分离的(非聚集),并且主键索引和辅助索引(二级索引)的储存方式是一样的。

在这里插入图片描述
在这里插入图片描述

InnoDB

  • 在InnoDB中,数据和索引文件是合起来储存的,都会存储在 表名.ibd 文件中。
    在这里插入图片描述

  • InnoDB中索引文件和数据文件是同一个文件(聚集),并且主键索引和二级索引储存方式有所不同,如图所示,二级索引的叶子节点不储存数据,仅储存主键ID。
    在这里插入图片描述

  • 这里注意几点:

    • 1、为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?

      • 如果我们在创建表时不设置主键,InnoDB会自动帮我们从第一列开始筛选一列数据不重复的列做为主键,如果找不到这样的列,就会创建一个隐藏的列(rowid)做为主键,这会增加很多MySQL的工作,所以建议我们在创建InnoDB表时一定要设置主键。
      • 如果主键id是无序的,那么很有可能新插入的值会导致当前节点分裂,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。反之,如果每次插入有序,那就会在当前页后面连续写入,写不下就会重新分配一个节点,内存都是连续的,这样效率自然也就最高了
    • 2、为什么非主键索引结构叶子节点存储的是主键值?

      • 非主键索引的叶子节点存储主键值而非全部数据,主要也是为了一致性和节省空间。如果二级索引储存的也是数据,那么每次插入MySQL都不得不更新每棵索引树,这样就加剧了新增编辑时的性能损耗,并且这样一来空间利用率也不高,必然产生了大量冗余数据

四、InnoDB 联合索引底层数据结构

联合索引又叫复合索引,假设我们有一个用户表有5个字段(id、name、age、job、address),我们建立name、age、job这三个字段的联合索引 例如:

`idx_name_age_job` (`name`,`age`,`job`);

索引结构:
在这里插入图片描述

  • 比较相等时,先比较第一列的值,如果相等,再继续比较第二列,以此类推。

  • 了解了联合索引的存储结构,我们就知道了索引最左前缀优化原则是怎么回事了,在使用联合索引时,对于索引列的定义顺序将会影响到最终查询时索引的使用情况。例如联合索引(name,age,job),MySQL会从最左边的列优先匹配,如果最左边的带头大哥name没有使用到,在未使用覆盖索引的情况下,就只能全表扫描。

  • 联合底层数据结构思考:MySQL会优先以联合索引第一列匹配,此后才会匹配下一列,如果不指定第一列匹配的值,也就无法得知下一步查询哪个节点。

五、MySQL 中三次磁盘IO最大能检索多少数据

在InnoDB里,每个页面默认16KB,可以通过以下SQL语句查询到,当然这个值是可以调的,既然官方给出这个阈值说明再大的话会影响磁盘IO效率。
在这里插入图片描述

  • 这里可以看到 MySQL Innodb查询页数据大小为 16384B,即16KB

  • 假如:B+Tree高度为3,B+Tree的表都存满了,主键索引的类型为BigInt,大小为8B,指针存储了下个节点的文件地址,大小为6B。最后一层,假设存放的数据data为1K 大小,那么一页里就可以存储16K/14=1170个(主键+指针)。

  • 一颗高度为2的B+树能存储的数据为:1170 * 16 = 18720(条)

  • 一颗高度为3的B+树能存储的数据为:1170 * 1170 * 16 ≈ 2190(万条)

  • 同理,在高度h=4时,总行数=1170 * 1170 * 1170 *16 ≈ 256(亿条)!!!

在这里插入图片描述

而且一般来说,MySQL会把 B+Tree 根节点放在内存中,那只需要两次磁盘IO就能检索千万级数据,三次磁盘IO就能检索百亿级数据。

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

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

相关文章

漂流伞顾曼宁(顾曼)的创业之路:相信的力量

顾曼宁&#xff08;顾曼&#xff09;的心情在蚂蚁生态全球CEO大会上充满了感动和鼓舞。这是一个期待已久的盛会&#xff0c;时隔三年&#xff0c;蚂蚁生态全球的首席执行官们再次汇聚一堂。智慧与商业的碰撞下&#xff0c;更藏着感情与坚持的交汇。 蚂蚁集团举办了【相信展】的…

求生之路2服务器搭建插件安装及详细的游戏参数配置教程linux

求生之路2服务器搭建插件安装及详细的游戏参数配置教程linux 大家好我是艾西&#xff0c;在上一篇文章中我用windows系统给搭建演示了一遍怎么搭建自己的L4D2游戏。 那么也有不少小伙伴想知道linux系统的搭建方式以及在这个过程中有什么区别。 那么艾西今天就跟大家分享下用lin…

Nginx可视化管理工具结合cpolar实现远程访问内网服务

前言 Nginx Proxy Manager 是一个开源的反向代理工具&#xff0c;不需要了解太多 Nginx 或 Letsencrypt 的相关知识&#xff0c;即可快速将你的服务暴露到外部环境&#xff0c;并且支持 SSL 配置。基于 Tabler 的美观且安全的管理界面,无需了解 Nginx 即可轻松创建转发域、重定…

生产看板管理系统助力车间生产线提升产量、质量

随着制造业的发展和市场竞争的加剧&#xff0c;企业需要寻求创新的生产管理解决方案来提高生产效率和质量。而车间生产看板管理系统正是满足这一需求的理想选择。这种系统通过实时监控生产线上的各项指标&#xff0c;帮助企业及时发现生产问题&#xff0c;并采取相应的措施。通…

【送书活动】《客户成功的力量》——客户成功体系如何构建?请看这7步

文章目录 前言当下客户成功的痛点客户成功体系构建七步法作者简介赠书活动 前言 在中国企业服务领域的发展过程中&#xff0c;客户成功从在中国萌芽开始&#xff0c;行业内外对其讨论几乎没有停止过。近段时间&#xff0c;关于客户成功的讨论再次被业内广泛关注&#xff0c;原因…

微力私人网盘通过cpolar端口映射,成功实现远程访问本地电脑!

文章目录 1.前言2. 微力同步网站搭建2.1 微力同步下载和安装2.2 微力同步网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 私有云盘作为云存储概念的延伸&#xff0c;虽然谈不上多么新颖&#xff0c;但是其…

遥遥领先-华为发布会重磅来袭!我的梦,刘德华...

本次发布会一共涉及了三个头号人物&#xff0c;分别是 1.余承东 2.刘德华 3.何刚 对于很多伙伴期待的手机&#xff0c;本次发布会是没有登场的&#xff0c;也有部分伙伴猜测华为是由于部分原因没有登场。 相信后期将会有有更大的策划和科技登场~ “穿过了黑夜&#xff0c;…

【C语言干货】一秒钟记住52个字母的ASCII码

一、ASCII的介绍 ​​ASCII (American Standard Code for Information Interchange)&#xff1a;美国信息交换标准代码是基于拉丁字母的一套电脑编码系统&#xff0c;主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准&#xff0c;并等同于国际标准 ISO/IEC 646。…

ubuntu 14.04更新GCC版本

按最基本的apt-get install gcc-8&#xff0c;不成功&#xff0c;提示如下。 按网上说的&#xff1a;apt-get update ,apt-get upgrade 后都无效果。 apt-cache search get 搜索后&#xff0c;发现资源链接里最新的也只有4.8.4所以不行。 需要更新资源链接&#xff0c;镜像地…

uni-app:实现背景渐变效果

效果 代码 单个渐变色 background-image: linear-gradient(to top right, #f00, #00f); 多个渐变色 background-image: linear-gradient(to bottom, #0073ff 0%, #1d6cff 25%, #1e8bff 50%, #41b3ff 100%); /* 多个渐变色 */ <template><view></view> <…

【Vue.js】使用Element搭建首页导航左侧菜单

目录 Mock.js 是什么 有什么好处 安装mockjs ​编辑 引入mockjs mockjs使用 login-mock Bus事物总线 首页导航栏与左侧菜单搭建 结合总线完成组件通讯 Mock.js 是什么 Mock.js是一个用于生成随机数据的模拟数据生成器。它可以帮助开发人员模拟接口请求&#xff0c;生…

轻松几步操作,视频边框背景虚化无压力

在视频剪辑的世界中&#xff0c;许多人都苦于繁琐的操作和复杂的流程。然而&#xff0c;如果你掌握了正确的工具和方法&#xff0c;许多复杂的任务可以变得简单高效。今天&#xff0c;我将分享一个简单实用的视频剪辑技巧&#xff0c;让你轻松完成批量剪辑视频并虚化边框的快速…

常识判断 --- 党史

目录 中共1~3大 例题 国民党 例题 中共4~5大 例题 中共起义~会议 例题 中共六届六中全会&#xff08;1938年9月&#xff09; 中共七大&#xff08;1945年4月&#xff09; 例题 中共七届二中全会 例题 中共8~10大 中共11~12届全会 例题 中共13~14大 …

基于物联网的农村地区智能微电网系统(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Generative AI 新世界 | 扩散模型原理的代码实践之采样篇

在上一期的文章中&#xff0c;探讨了在 Amazon SageMaker Studio 上使用 QLoRA 等量化技术微调 Falcon 40B 大语言模型。而从本期开始&#xff0c;我们将一起尝试在更深的知识维度&#xff0c;继续探究生成式 AI 这一火热的新知识领域。 亚马逊云科技开发者社区为开发者们提供全…

Leetcode 877. 石子游戏

文章目录 题目代码&#xff08;9.23 首刷看解析&#xff09; 题目 Leetcode 877. 石子游戏 代码&#xff08;9.23 首刷看解析&#xff09; 博弈 class Solution { public:bool stoneGame(vector<int>& piles) {int len piles.size();vector<vector<int>…

纷享销客连接型CRM:营销数字化离不开业务指标化

近日&#xff0c;2023金蝶云星空数字化转型巡展&#xff08;嘉兴站&#xff09;在嘉兴圆满举办。 纷享销客浙江分公司代表受邀参加并发表演讲。 纷享销客浙江分公司代表孙石磊 活动现场&#xff0c;纷享销客浙江分公司代表孙石磊带来主题为《连接型CRM赋能企业新增长》的分享。…

Java LinkedList类详解

目录 什么是LinkedList LinkedList的使用 LinkedList的构造 LinkedList的其他常用方法的介绍 LinkedList的遍历 ArrayList和LinkedList的区别 什么是LinkedList LinkList的底层是双向链表结构&#xff0c;由于链表没有将元素存储在连续的空间中&#xff0c;元素存储在单独…

高速USB转4路RS422串口

基于480Mbps 高速USB转8路串口芯片CH344Q&#xff0c;可以为各类主机扩展出4个独立的串口。CH344芯片支持使用操作系统内置的CDC串口驱动&#xff0c;也支持使用厂商提供的VCP串口驱动程序&#xff0c;可支持Windows、Linux、Android、macOS等操作系统。因CDC类协议和类驱动的原…

Java开发需要的网络基础知识,搞清楚计算机网络底层原理

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&#xff0c;请私信或评论留言&#xff01; 前言 计算机基础是…