当前位置: 首页 > news >正文

深入理解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作为主键

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

相关文章:

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

听课问题(听完课自己查资料) 什么是二叉树 二叉树是怎么存储数据的一个链表是一个集合的数据结构 List是怎么便利找到指定下标元素为什么会快&#xff1f;什么是红黑树 红黑树是怎么存储数据的什么是B TREE 是怎么存储数据的什么是BTREE 是怎么存储数据的 疑惑答案 a. 二叉树…...

使用 Tkinter 制作一个进制转换工具,好用!

在平时工作学习当中&#xff0c;我们经常会编写一些简单的 Python GUI 工具&#xff0c;以此来完成各种各样的自动化任务&#xff0c;比如批量处理文件&#xff0c;批量处理图片等等。当我们进行这些工具的编写之时&#xff0c;往往只关注了功能的实现&#xff0c;而忽略了页面…...

Final Cut 视频剪辑快速入门,小白上手视频课的制作

本文是一个快速入门教程&#xff0c;如果您是0视频处理基础&#xff0c;又想录制网课或是一些对效果要求不高的视频那么这篇教程足够使用了。 本文主要用Final Cut处理视频课&#xff0c;本文是笔者在制作视频课过程中逐渐摸索的&#xff0c;如果您想制作一些比较专业的视频&a…...

分布式定时任务Xxl_Job详细使用手册

看了很多网上的版本&#xff0c;思路描述的都不是很清晰&#xff0c;都只是几步操作就完成了&#xff0c;看效果&#xff0c;导致容易走入弯路&#xff08;不排除是自己理解能力把&#xff09;&#xff0c;最开始以为是把admin模块集成到项目&#xff0c;后来测试了会&#xff…...

【PostgreSQL】表操作-修改表

【PostgreSQL】表操作快速链接 创建表及基础表命令 修改表 表权限 添加列 ALTER TABLE products ADD COLUMN description text;新列最初填充给定的任何默认值DEFAULT&#xff08;如果未指定子句&#xff0c;则为 null&#xff09;。 注意&#xff1a; 从 PostgreSQL 11 开始…...

【Java系列】文件操作详解

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …...

docker-compose 安装 RocketMq

目录 1、rocketMq 官网 2、工作流程 RocketMQ集群工作流程​ 1. 启动NameServer​ 2. 启动 Broker​ 3. 创建 Topic​...

【心得】PHP反序列化高级利用(phar|session)个人笔记

目录 ①phar反序列化 ②session反序列化 ①phar反序列化 phar 认为是java的jar包 calc.exe phar能干什么 多个php合并为独立压缩包&#xff0c;不解压就能执行里面的php文件&#xff0c;支持web服务器和命令行 phar协议 phar://xxx.phar $phar->setmetadata($h); m…...

MyBatisPlus之增删改查

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 MyBatisPlus之增删改查 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、什么是Mybati…...

pytorch03:transforms常见数据增强操作

目录 一、数据增强二、transforms--Crop裁剪2.1 transforms.CenterCrop2.2 transforms.RandomCrop2.3 RandomResizedCrop2.4 FiveCrop和TenCrop 三、transforms—Flip翻转、旋转3.1RandomHorizontalFlip和RandomVerticalFlip3.2 RandomRotation 四、transforms —图像变换4.1 t…...

blob文件流前端显示pdf

首先请求需要修改 responseType: ‘blob’, 需要修改 请求头 {responseType: blob,url: url,method: get,}三种方法&#xff1a; 1.直接处理&#xff0c;在新页面打开 const blob new Blob([data],{ type:application/pdf }) let url window.URL.createObjectURL(blob) wi…...

Android 接入第三方数数科技平台

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、数数科技平台是什么&#xff1f;二、使用步骤1.集成SDK2. 初始化3. 发送事件和设置账号id4. 验证发送事件是否成功 小结 前言 一个成熟的App必然不可缺少对…...

LVM和磁盘配额

一&#xff1a;LVM概述&#xff1a; LVM 是 Logical Volume Manager 的简称&#xff0c;译为中文就是逻辑卷管理。 能够在保持现有数据不变的情况下&#xff0c;动态调整磁盘容量&#xff0c;从而提高磁盘管理的灵活性 /boot 分区用于存放引导文件&#xff0c;不能基于LVM创建…...

uni-app uni-app内置组件

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…...

C语言——格式说明符前面加修饰符

在C语言中&#xff0c;格式说明符前面可以添加一些修饰符来控制输出或输入的格式&#xff0c;主要包括宽度、精度、左对齐标志和前缀填充字符等。 1. 宽度&#xff08;Width&#xff09; %[width]type&#xff1a;这里的width是一个非负整数&#xff0c;表示输出字段的最小宽度…...

实验室(检验科)信息系统LIS源码,客户端:WPF+Windows Forms

lis系统源码&#xff0c;医学检验信息系统源码 LIS系统&#xff08;Laboratory Information System&#xff09;即实验室&#xff08;检验科&#xff09;信息系统&#xff0c;它将检验仪器付出的检验数据与相关信息接入计算机网络系统中&#xff0c;让患者、实验室、临床科室、…...

有道翻译web端 爬虫, js

以下内容写于2023-12-28, 原链接为:https://fanyi.youdao.com/index.html#/ 1 在输入框内输入hello world进行翻译,通过检查发出的网络请求可以看到翻译文字的http接口应该是: 2 复制下链接最后的路径,去js文件中搜索下: 可以看到这里是定义了一个函数B来做文字的翻译接口函数…...

uni-app API接口扩展组件(uni-ui)

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…...

信息化和数字化的本质区别是什么?

信息化和数字化是两个概念的区别 它们有什么区别和联系呢&#xff1f;信息化&#xff1a;“业务数据化”&#xff0c;先让业务流程能被数据记录下来。信息化“业务数据化”。数字化&#xff1a;“数据业务化”&#xff0c;用已累积的业务数据去反哺优化业务流程。数字化“数据…...

发表《Nature》!美国研究团队发布可编程逻辑量子处理器

​&#xff08;图片来源&#xff1a;网络&#xff09; 近期&#xff0c;美国研究团队开发了一款可编程的逻辑量子处理器&#xff0c;并展示了可靠且可扩展的量子计算所需的关键要素&#xff0c;该成果已发表于《Nature》期刊&#xff08;doi&#xff1a;10.1038/s41586-023-06…...

CISSP 第1章:实现安全治理的原则和策略

作者&#xff1a;nothinghappend 链接&#xff1a;https://zhuanlan.zhihu.com/p/669881930 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 CIA CIA 三性&#xff1a; 机密性&#xff1a;和数据泄露有关。完整性…...

【并发设计模式】聊聊线程本地存储模式如何实现的线程安全

前面两篇文章&#xff0c;通过两阶段终止的模式进行优雅关闭线程&#xff0c;利用数据不变性的方式保证数据安全&#xff0c;以及基于COW的模式&#xff0c;保证读数据的安全。本篇我们来简述下如果利用线程本地存储的方式保证线程安全。 首先一个大前提就是并发问题&#xff…...

边缘计算网关:重新定义物联网数据处理

随着物联网&#xff08;IoT&#xff09;设备的爆炸式增长&#xff0c;数据处理和分析的需求也在迅速增加。传统的数据处理方式&#xff0c;将所有数据传输到中心服务器进行处理&#xff0c;不仅增加了网络负担&#xff0c;还可能导致数据延迟和安全问题。因此&#xff0c;边缘计…...

Linux之下载安装

rpm包管理 rpm介绍 rpm用于互联网下载包的打包及安装工具&#xff0c;他包含在某些linux分发版本中。他生成具有.rpm扩展名的文件。RPM是RedHat Package Manager(RedHat软件包管理工具&#xff09;的缩写&#xff0c;类似windows的steup.exe。 rpm包的查询指令 查询已经安装…...

【HarmonyOS开发】案例-记账本开发

OpenHarmony最近一段时间&#xff0c;简直火的一塌糊度&#xff0c;学习OpenHarmony相关的技术栈也有一段时间了&#xff0c;做个记账本小应用&#xff0c;将所学知识点融合记录一下。 1、记账本涉及知识点 基础组件&#xff08;Button、Select、Text、Span、Divider、Image&am…...

webrtc中的接口代理框架

文章目录 接口代理框架Proxy体系类结构导出接口 webrtc的实际运用PeerConnectionFactoyPeerConnection使用 接口代理框架 webrtc体系庞大&#xff0c;模块化极好&#xff0c;大多数模块都可以独立使用。模块提供接口&#xff0c;外部代码通过接口来使用模块功能。 在webrtc中通…...

【AIGC-图片生成视频系列-4】DreamTuner:单张图像足以进行主题驱动生成

目录 一. 项目概述 问题&#xff1a; 解决&#xff1a; 二. 方法详解 a) 整体结构 b) 自主题注意力 三. 文本控制的动漫角色驱动图像生成的结果 四. 文本控制的自然图像驱动图像生成的结果 五. 姿势控制角色驱动图像生成的结果 2023年的最后一天&#xff0c;发个文记录…...

Jupyter Notebook的10个常用扩展介绍

Jupyter Notebook&#xff08;前身为IPython Notebook&#xff09;是一种开源的交互式计算和数据可视化的工具&#xff0c;广泛用于数据科学、机器学习、科学研究和教育等领域。它提供了一个基于Web的界面&#xff0c;允许用户创建和共享文档&#xff0c;这些文档包含实时代码、…...

uniapp项目如何引用安卓原生aar插件(避坑指南三)

官方文档说明&#xff1a;uni小程序SDK 【彩带- 避坑知识点】 如果引用原生aar插件&#xff0c;都配置好之后&#xff0c;云打包&#xff0c;报不包含此插件&#xff0c;除了检查以下步骤流程外&#xff0c;还要检查一下是否上打包的原生插件aar流程有问题。 1.第一步在uniapp项…...

YOLOv8改进 | 检测头篇 | ASFF改进YOLOv8检测头(全网首发)

一、本文介绍 本文给大家带来的改进机制是利用ASFF改进YOLOv8的检测头形成新的检测头Detect_ASFF&#xff0c;其主要创新是引入了一种自适应的空间特征融合方式&#xff0c;有效地过滤掉冲突信息&#xff0c;从而增强了尺度不变性。经过我的实验验证&#xff0c;修改后的检测头…...

小公司网站如何做/浙江seo技术培训

今天东哥想用Scorpio Pro 5查一下猪场某人邮箱的密码&#xff0c;发现不太好使。决定自己写个自己用。代码如下 #!/usr/bin/python #-*- coding:utf-8 -*- #输入这一条就可以在Python脚本里面使用汉语注释&#xff01;此脚本可以直接复制使用&#xff1b;while True: …...

wordpress 初始化/seo顾问合同

原因: Springboot版本为2.1.3.RELEASE, Netty版本为4.1.50.Final, 引入spring-boot-starter-data-redis依赖后, 因为其中也有Netty依赖, 但是版本只有4.1.33, 因而版本冲突导致异常 解决方法: 1. 将Springboot版本改为2.2.6.RELEASE 2. 或将Netty版本改为4.1.33.Final<pa…...

太原做网站的工作室/营销网

来自&#xff1a;http://deeplearning.net/software/theano/tutorial/loop.html loop 一、Scan 一个递归的通常的形式&#xff0c;可以用来作为循环语句。约间和映射&#xff08;在第一个&#xff08;leading&#xff0c;个人翻译成第一个&#xff09;维度上进行循环&#xff0…...

wordpress上传按钮/网站域名解析ip查询

导读&#xff1a;所谓事毕回复&#xff0c;说的是该回复就要及时回复。领导交给你的任务&#xff0c;完成了吗&#xff1f;没完成的话是因为什么&#xff1f;并且&#xff0c;工作中往往不能等任务全部完成了再回复&#xff0c;阶段性的进展也要及时报告。能及时回复领导或同事…...

北京智能网站建设制作/广州seo代理

上一篇我们主要学习了一维数组的操作&#xff0c;现实场景中&#xff0c;一维数组往往无法满足需要&#xff0c;本关将学习略微复杂的多维数组。多维数组一维数组只有行&#xff0c;二维数组相比一维数组多了列这个维度&#xff0c;而三维数组则类似多个二维数组堆叠在一起&…...

公司网站备案 问我借身份证 怎么拒绝/seo优化技术培训

1、安装N卡驱动 首先添加源 sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update然后检查可以安装的驱动版本号 nvidia-msi选择适合自己的驱动&#xff0c;这里需要注意不同版本的cuda需要的驱动版本号也不一样&#xff0c;参考表链接点这里 Ubuntu 18.04安…...