深入理解MySQL索引底层数据结构

听课问题(听完课自己查资料)

  1. 什么是二叉树 二叉树是怎么存储数据的
  2. 一个链表是一个集合的数据结构 List是怎么便利找到指定下标元素为什么会快?
  3. 什么是红黑树 红黑树是怎么存储数据的
  4. 什么是B TREE 是怎么存储数据的
  5. 什么是B+TREE 是怎么存储数据的

疑惑答案

a. 二叉树是按照插入的顺序依次排序

比如依次插入的数据 为 : 5、4、6、5、5、5、5

他们存储的时候为 :

  • 5是第一个存进去的 所以放在了第一个也就是根节点
  • 4第二个放进去小于根节点 5 所以在 左边
  • 6第三个放进去大于根节点放在右边
  • 5第四个放进去等于(不小于根节点)根节点所以放在根节点5右边 又因为右边有6了 小于6所以放在了6的左边
  • 5第五个放进去不小于根节点5放左边 又小于6放左边又不小于5放右边
  • 剩下的同理....

ⅰ. 查询方法

比如查询 6 会发现根节点为5 因为6大于5所以去右边找然后就找到了5

ⅱ. 二叉树优点

查询速度快, 比如查询6 这样直接就去右边节点找了可以直接排除左边的数据,而不用去对比全部的数据了

ⅲ. 二叉树缺点

可能会出现偏移的特别厉害 比如1、2、3、4、5依次插入 就会导致形成一个链表,这样二叉树就没必要了

b. 二叉树会形成链表 那么链表为什么会快呢?

例如Java中的链表

ArrayList是一个带有下标的数组

而LinkedList是一个不带有下标的链表根据插入的顺序串在一起的链表,他的查询速度会比较慢是因为 每次查询都要遍历所有的元素

所以他们中ArrayList是一个查询比较快的List 主要是因为 一个数组他是可以通过下标获取元素的

而二叉树中如果形成了类似于一个链表就会导致和LinkedList一样每次查询都会遍历所有的元素

c. 平衡二叉树

红黑树插入-别再玩什么旋转了_哔哩哔哩_bilibili

可以看这个视频

如果不平衡 解决办法 找到一个不平衡那两条线中最长的一条线 然后取出邻近根节点最近的三个元素 重新组成一个小的树 其他没设计到这条最长路线的元素原封不动 设计到的重新进行排序进去

ⅰ. 平衡二叉树优缺点

优点: 保证了不会出现链表结构

缺点:每次都需要左右旋 每次新增需要的步骤太多 而且可能会导致树的高度很高 查询性能也会下降

d. 什么是红黑树 红黑树是怎么存储元素的

红黑树插入-别再玩什么旋转了_哔哩哔哩_bilibili

红黑树首先保证以下几点

  • 根节点必须是黑色
  • 红色上级和下级必须是黑色
  • 叶子节点必须是红色
  • 新插入的必须是红色

例题:

如果发现 位置出现了调换,那么涉及到调换的地方涉及到的元素在重组后重新排序添加进去

ⅰ. 红黑树优点

红黑树复杂的要求都是为了保证了树的平衡和树的高度不那么高

ⅱ. 红黑树缺点

对于mysql为什么不用红黑树是因为 一个张表可能存储上千万数据 一个节点存储的数据有限也会导致树的深度太高

什么是B TREE

可以理解为很多个红黑树组合而成 只不过他们的根节点有很多个 这样就会降低树的深度 从而查询快

B TREE是对红黑树的整合 只不过B TREE是每个节点都会存储地址值

只不过中间节点上会存储它对应的数据

e. 什么是B + TREE

因为B TREE 根节点会存储 对应的数据 加入一个 数据为 1k 根节点一共是16k的数据 这样会导致存储的节点数量减少 进而导致子节点减少 导致存储的总数据减少

而 B + TREE 把存储的数据都放到了叶子节点 这样根节点的 16kb 内存全部存储 子节点的地址 可以增加存储的数量 就可以做到降低树的高度提高查询效率

ⅰ. 一个B+TREE三层可以存储多少数据计算

第一层:假设一个BigInt类型的数据大小为 8b 而mysql中一个地址值为 6b 他们加起来是 14b 16kb/14b = 1142

第二层:同理子节点也为 1142一个

第三层:叶子节点 一个索引就会对应一个数据或者地址值 因为innerdb 存储的是数据 mysiam存储的是地址值 假设他们都为1k最大 那么就是 可以存储16个

最终也就是 三层总数量为 1142 * 1142 * 16 = 20,866,624 差不多两千万数据

1. 聚集索引

不需要回表

a. db引擎如果是主键索引 非叶子节点存储的什么?

主键索引存储的都是该主键对应的一条数据,所以db引擎查询比非聚集引擎快

b. db引擎如果是非主键索引非叶子节点存储的什么

其实非主键索引 并不是聚集索引 因为他要回表

非主键索引非叶子节点存储的其实是主键 通过条件去非主键索引构建的树中找到对应的非叶子节点,非叶子节点存储的是数据对应的主键(比如id,rowid) 通过找到的主键再去主键索引中找到对应的数据(去主键索引中找对应的数据就是一次回表操作,相比较于主键索引会慢,因为主键索引不用回表,找到了对应数据就直接返回)

c. db使用联合索引或者某一个字段(非主键字段)当作索引 那么非叶子节点存储的是什么?

非叶子节点存储的就是主键 如果该表中没有主键 那么mysql就会自己找一行没有重复的数据当作主键,如果每行数据都会有重复的那么就会自己生成一个隐藏的 rowId作为主键 他们就会存储到 联合索引构成的树中的非叶子节点中作为值,找到以后通过回表主键索引找到对应的数据。

d. db引擎为什么非主键索引非叶子节点存储的是主键id或者rowid?

因为这样可以减少空间存储 我们平常公司中使用的一块内存其实都是比较昂贵的,如果我们一个非主键索引使用的联合索引,那么非叶子节点如果存储对应的索引字段,就会非常占用空间,因为我们存储的是联合索引,有好几个字段共同组成的,一次性存储了好几个字段值会比较浪费空间

2. 非聚集索引

需要回表

非聚集索引就是需要回表 mysiam存储的其实就是 myd磁盘文件中对应的数据地址

比如 通过主键或者非主键索引维护的树,聚集索引中主键索引非叶子节点存储的就是对应的一行数据,但是mysiam中非叶子节点存储的就是该条数据对应的磁盘文件地址。通过条件找到对应非叶子节点,通过非叶子节点中对应磁盘文件地址去myd文件中找到对应数据再返回。因为多了一次回表操作所以一般会比聚集索引慢

3. hash运算

MySQL中hash算法其实比B TREE算法快。因为每次都是计算一次hash就直接判断出来在那个位置放着,找到该位置直接放到该位置的链表中就行了。

查询: 通过条件就可以直接定位到该元素在那个位置,找到该链表就可以找到对应元素磁盘文件地址值,再去对应磁盘文件中找到该数据返回 参照HashMap 是比较快的

缺点: 只能进行精确匹配 如果使用 > 或者 like 查询 是不支持的只能全表查询

因为 他是进行hash计算的

如果 一个 hmh 比如计算的hash 是 50 现在通过 h进行模糊匹配 h 对应hash比如是 20 那么找到对应的位置其实并不是 hmh对应的位置所以不支持模糊

4. 联合索引

a. 为什么只有走最左前缀才能走索引

上边两张图片 比如联合索引为 name age position 那么第二张图片分别为三次查询。判断谁走索引谁不走?

第一条肯定是走的 因为联合索引为 name age position 构建索引树的时候首先会先根据name进行排序 如果name相同就会根据age排序 如果name和age都一样根据 position排序

第一条sql走索引 因为 先去找name字段对应的Bill的数据 可以找到一个区间 因为已经根据name排好序了 再给这个区间找到 age为3的,age也排序了所以也很好找

第二条不走索引 因为第一张图也可以看到 他们先通过name排序的 如果有好几个人age一样但是name不一样他们首先再通过name排序的时候就会被打散 会分布到不同区间 所以需要全表找

第三条和第二条同理 不走索引

5. 面试问题

B + TREE中是双向链表,那么这个双向链表有什么作用呢?

可以更快的找到上/下一个元素  比如我们通过自增主键id做索引,那么他们肯定是排好序的,再写sql时比如用到了   3<id < 10  这时候会找id > 3的 依次给下找   如果发现当前区间已经找完了并且当前区间最后一个元素 < 10  那么就会通过最后一个元素所指向下一个区间的元素接着找,直到  id !< 10为止。这样就加快的查找的速度,而不是当前区间找完了去找下一个区间应该在什么位置接着去找,是直接就根据双向指针锁定了下一个元素的位置;

a. 聚集索引和非聚集索引那个快?

聚集索引快,因为聚集索引不需要进行回表操作

b. 为什么db引擎推荐使用自增作为主键

因为索引本身就是需要进行排序的 如果不使用自增作为主键 那么再构建树的时候就会频繁的改变树的结构 如果使用自增作为主键 再插入数据的时候直接往后面新增就完全可以了,即使改变结构也是新增那一块小地方需要该

c. 索引使用uuid和int自增那个比较好?为什么?

使用int自增比较好,因为int不浪费磁盘空间 一个根节点和叶子节点只能存储16kb大小 如果索引越小就代表可以平铺下来更多的节点数据

d. db索引如果没有主键那么数据是怎么做成树的

首先会找到所有列中值不重复的一列作为主键 如果发现没有不重复的列 那么就会自己生成一个rowId作为主键

自学笔记,各位大佬如果有错的地方欢迎指正。谢谢

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用通俗易懂的方式讲解:结合检索和重排序模型,改善大模型 RAG 效果明显

最近出现了在构建聊天机器人方面的应用浪潮&#xff0c;这主要得益于LlamaIndex 和 LangChain 这样的框架。许多这类应用都采用了用于检索增强生成&#xff08;RAG&#xff09;的标准技术栈&#xff0c;其中包括以下关键步骤&#xff1a; 向量存储库&#xff1a; 使用向量存储库…

状态机(有限状态机(Finite State Machine, FSM)、推进自动机(Pushdown Automata)、并发状态机、分层状态机)

文章目录 状态机&#xff08;State Machine&#xff09;定义与组成定义组成状态&#xff08;States&#xff09;事件&#xff08;Events&#xff09;转换&#xff08;Transitions&#xff09;初始状态&#xff08;Initial State&#xff09; 状态机的类型有限状态机&#xff08…

网络调试 UDP1,开发板用静态地址-入门6

https://www.bilibili.com/video/BV1zx411d7eC?p11&vd_source109fb20ee1f39e5212cd7a443a0286c5 1, 开发板连接路由器 1.1&#xff0c;烧录无OS UDP例程 1.2&#xff0c;Mini USB连接电脑 1.3&#xff0c;开发板LAN接口连接路由器 2. Ping开发板与电脑之间通信* 2.1 根据…

某金属加工公司的核心人才激励体系搭建项目纪实

【客户行业】金属加工行业 【问题类型】薪酬体系/激励体系 【客户背景】 某大型金属加工企业位于河北地区&#xff0c;成立于2000年&#xff0c;隶属于某大型有色金属集团&#xff0c;是一家集科研、开发、生产、销售于一体的国有企业&#xff0c;人员达到1000人。经过多年…

【Redis端口】通过修改端口一个计算机上可以运行两个redis

一个计算机上可以运行多个Redis实例。每个Redis实例都会监听一个特定的端口&#xff0c;所以只要确保每个实例使用的端口不冲突&#xff0c;就可以在同一台计算机上运行多个Redis实例。例如&#xff0c;你可以配置一个Redis实例监听6379端口&#xff0c;另一个Redis实例监听638…

阿里云服务器配置jupyter(新手入门,详细全面)

设置安全组 1.租好服务器后在阿里云服务器平台上打开控制台&#xff08;右上角&#xff09; 2.点开自己的云服务器控制台&#xff0c;在左栏“安全组”部分添加安全规则&#xff0c;点击“管理规则” 单击“手动添加”&#xff0c;将安全组设为如下格式&#xff0c;端口范围…

Java经典框架之Dubbo

Dubbo Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. Dubbo概述 2. Dubbo基本应用 3…

React基础应用及常用代码

目录 基础知识 babel.config.js js,html,css,Vue,react,angular,nodejs,webpack,less,ES6,commonjs等的关系 ECMAScript 6&#xff08;ES6&#xff09; let、const、var 的区别 Webpack、npm、node关系 props和state区别 通用框架类 ES 6 export React React.Fragm…

【LLM】大型语言模型:2023年完整指南

Figure 1: Search volumes for “large language models” 近几个月来&#xff0c;大型语言模型&#xff08;LLM&#xff09;引起了很大的轰动&#xff08;见图1&#xff09;。这种需求导致了利用语言模型的网站和解决方案的不断开发。ChatGPT在2023年1月创下了用户群增长最快…

thinkphp学习04-控制器定义

控制器&#xff0c;即 controller&#xff0c;控制器文件存放在 controller 目录下&#xff1b; 如果想改变系统默认的控制器文件目录&#xff0c;可以在 config 下 route.php 配置&#xff1a; 将controller修改为controller123&#xff0c;就会报错&#xff0c;说明这个配置…

【大数据进阶第三阶段之Hive学习笔记】Hive安装

【大数据进阶第三阶段之Hive学习笔记】Hive安装-CSDN博客 【大数据进阶第三阶段之Hive学习笔记】Hive常用命令和属性配置-CSDN博客 【大数据进阶第三阶段之Hive学习笔记】Hive基础入门-CSDN博客 【大数据进阶第三阶段之Hive学习笔记】Hive查询、函数、性能优化-CSDN博客 …

Linux与安全

本心、输入输出、结果 文章目录 系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第八部分&#xff1a;Linux、安全 前言 Linux 文件系统解释应该知道的 18 个最常用的 Linux 命令HTTPS如何工作&#xff1f; 数据是如何加密和解密的&#xff1f;为什么HTTPS在数据传输过程…

【AIGC-图片生成视频系列-6】SSR-Encoder:用于主题驱动生成的通用编码器

目录 一. 贡献概述 二. 方法详解 a) 训练阶段 b) 推理生成阶段&#xff1a; 三. 综合结果 四. 注意力可视化 五. 选择性主题驱动图像生成 六. 人体图像生成 七. 可推广到视频生成模型 八. 论文 九. 个人思考 稳定扩散&#xff08;Stable Diffusion&#xff09;模型可…

vue3项目中axios的常见用法和封装拦截(详细解释)

1、axios的简单介绍 Axios是一个基于Promise的HTTP客户端库&#xff0c;用于浏览器和Node.js环境中发送HTTP请求。它提供了一种简单、易用且功能丰富的方式来与后端服务器进行通信。能够发送常见的HTTP请求&#xff0c;并获得服务端返回的数据。 此外&#xff0c;Axios还提供…

用js计算 m-n 之间所有数的和

<script>let mprompt(输入小值)let nprompt(输入大值)function fn(min,max){let sum0for(let imin;i<max;i){sumi}return sum}let allfn(m,n)console.log(和&#xff1a;${all})</script> 效果&#xff1a;

【elfboard linux开发板】7.i2C工具应用与aht20温湿度寄存器读取

1. I2C工具查看aht20的温湿度寄存器值 1.1 原理图 传感器通过IIC方式进行通信&#xff0c;连接的为IIC1总线&#xff0c;且设备地址为0x38&#xff0c;实际上通过后续iic工具查询&#xff0c;这个设备是挂载在iic-0上 1.2 I2C工具 通过i2c工具可以实现查询i2c总线、以及上面…

C#,入门教程(11)——枚举(Enum)的基础知识和高级应用

上一篇&#xff1a; C#&#xff0c;入门教程(10)——常量、变量与命名规则的基础知识https://blog.csdn.net/beijinghorn/article/details/123913570 不会枚举&#xff0c;就不会编程&#xff01; 枚举 一个有组织的常量系列 比如&#xff1a;一个星期每一天的名字&#xf…

鸿蒙开发之拖拽事件

一、拖拽涉及的方法 Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)//拖拽开始.onDragStart((event: DragEvent) > {console.log(drag event onDragStartevent.getX())})//拖拽进入组件范围&#xff0c;需要监听onDrop配合.onDragEnter((event: DragEvent) …

backtrader框架初探,轻松跑通策略并策略分析

网上有很多backtrader的文章&#xff0c;并有些将其与vnpy做比较&#xff0c;经过安装后发现&#xff0c;还是backtrader教程简单。 1、前期准备 # 安装akshare免费行情源 pip install akshare -i http://mirrors.aliyun.com/pypi/simple/ --trusted-hostmirrors.aliyun.com …

前端--基础 常用标签 - ( 内部链接,空链接,下载链接,网页元素连接)

链接分类 &#xff1a; 外部链接 内部链接 空链接 下载链接 网页元素链接 内部链接 &#xff1a; 即 网站内部页面之间的相互链接&#xff0c;直接点击 链接内部页面名称即可 所谓内部链接&#xff0c;就是在同一个网站里面&#xff0c;有许多链接&#xff0c;当你在 a…
最新文章