MySQL索引数据结构
目录
1 索引常用的数据结构
1.1 二叉树
1.2 平衡二叉树
1.3 红黑树
1.3 Hash表
1.4 B树
1.4 B+树
2 MySQL索引的数据结构
2.1 MyISAM存储引擎索引
2.2 InnoDB存储引擎索引
2.2.1 聚集索引
2.2.2 非聚集索引
2.2.3 联合索引数
2.2.4 hash索引
1 索引常用的数据结构
1.1 二叉树
二叉树特点:
- 最顶端的称为根节点
- 没有子节点的称为叶节点
- 节点中k-v数据结构,key必须,v非必须
- 非叶子节点只能允许最多两个子节点存在
- 每个节点比左子树所有节点的值大,比右子树所有节点的值小
二叉树查找:
- 采取二分查找
- 最大查找的次数为树的高度
- 查找的时间复杂度为O(log n)
那么如果key的数据分布特点是单调递增或者递减呢?
- 二叉树会退化为链表
- 查找的时间复杂度变为O(n)
1.2 平衡二叉树
为解决二叉树存在的问题,引入了平衡二叉树
当左子树高度和右子树高度的差大于1时,进行旋转,那么就得到了平衡二叉树
平衡二叉树特点:
- 每个节点最多有两个子节点
- 每个节点的值比左子树所有节点的值大,比右子树所有节点的值小
- 每个节点的左子树的高度与右子树的高度差不超过1
那么为了保证二叉树的平衡,在插入数据需要进行一定的操作来保持二叉树的平衡,包括以下几种情况:
左左右
- 插入1节点后导致3号子树与8号子树高度差大于1
- 产生的原因是3号节点的左子树节点多了一个左节点,此时将3号节点右旋
- 右旋的流程为(当前节点为3节点,右旋就是让自己变成右子节点)
- 将父节点的左子节点设置为左子节点
- 将左子节点的右子节点设置为当前节点
左右左右
- 插入4节点后导致5子树与8子树高度差大于1
- 产生的原因是5节点的左子树多了一个右节点,此时先将3节点左旋,再将5节点右旋
- 左旋流程(当前节点为3节点)
- 将父节点的左子节点设置为右子节点
- 将右子节点的左子节点设置为当前节点
- 右旋流程(当前节点为5节点)
- 将父节点的左子节点设置为左子节点
- 将左子节点的右子节点设置为当前节点
右右左
- 插入5节点后导致3子树与8子树高度差大于1
- 产生的原因是3节点的右子节点多了一个右节点,此时将3节点左旋解决问题
- 左旋流程(当前节点为3节点)
- 将父节点的左子节点设置为右子节点
- 将右子节点的左子节点设置为当前节点
右左右左
- 插入4节点时导致3子树与8子树的高度差大于1
- 产生的原因是3节点的右子节点多了一个左子节点,此时将5节点右旋后再将3节点左旋解决
- 右旋流程(当前节点为5节点)
- 将父节点的右子节点设置为左子节点
- 将左子节点的右子节点设置为当前节点
- 左旋流程(当前节点为3号节点)
- 将父节点的左子节点设置为右子节点
- 将右子节点的左子节点设置为当前节点
思考:以上四种情况均考虑的是左子树高度大于右子树高度,那么反过来时又该如何呢?
平衡树虽然解决了数据单调递增或者递减时导致退化为链表的问题,但是在插入时,需要频繁的旋转来保持二叉树的平衡,对于插入修改的性能影响极大。
1.3 红黑树
为解决平衡二叉树插入更新时频发旋转带来的性能问题,引入了红黑树,红黑树通过以下两方面避免了频繁旋转问题
- 红黑树在某些时候允许左右子树的高度差大于1,只要符合红黑树规则即可
- 红黑树不平衡时,不一定非要旋转才能平衡,也可以通过改变颜色达到平衡
红黑树特点:
- 规则1:每个节点不是黑色就红色
- 规则2:根节点是黑色
- 规则3:红色节点的子节点都为黑色
- 规则4:所有所有叶子节点都是黑色
- 规则5:每个节点到叶子节点的每个路径黑色节点的个数都相等
红黑树变色逻辑
- 新插入的节点总认为是红色
- 如果在插入之后不符合规则,则变色
- 变色逻辑(当前节点为2节点)
- 父节点和叔节点变黑
- 如果祖父节点不是根节点,则变为红色,然后递归向上检查是否需要变色
- 如果是祖父节点是根节点,则不变,完成变色
红黑树旋转逻辑
- 变色之后如果还不满足红黑树规则,则进行选择
- 旋转的规则与平衡树一致
红黑树似乎已经解决了很多问题,那么再来想一下,当数据量很大的时候会导致红黑树的高度增大,那么再检索的时候,在最差的情况下每个节点会产生一次磁盘IO,对于检索的性能是影响是巨大的。
1.3 Hash表
- hash表在大多数情况下只需要计算一次hash,就可以定位到元素的位置
- 当hash冲突问题严重时,hash表也会退化成链表,导致检索性能降低
- 仅仅只能满足=,in等查询,不支持范围的查询
1.4 B树
B-Tree特点
- 节点中索引从左到右为递增序列
- 所有的索引元素不重复
- 叶子节点和非叶子节点都包含数据
- 叶子节点具备相同的深度,并且叶节点的指针为空
B树一个节点中包含多个数据,可以有效的降低树的高度,从而加快检索的性能
但是因为其非叶子节点中包含数据,会导致以下问题
- 一个非叶子节点中包含的数据量有限
- 插入时,如果一个节点数据达到上限时,势必会导致数据页的分裂和合并
- 而且由于非叶子节点包含数据,数据页的分裂和合并将会发生的非常频繁
- 如果需要进行范围查询时,如何实现高效查询呢?
1.4 B+树
B+Tree特点
- 非叶子节点不存储data,只存储索引,使得可以容纳更多的数据量
- 叶子节点包含所有索引和数据
- 叶子节点间按照索引递增排序,并且两个相邻叶子节点间有双向指针
B+树由于非叶子节点仅仅包含索引,使其在相同数据量的情况下,树的高度远远低于B树,从而加快检索的效率
2 MySQL索引的数据结构
2.1 MyISAM存储引擎索引
- MySQL中MyISAM存储引擎的数据文件和索引文件是分离的
- MyISAM存储引擎索引的数据结构
- 其采用B+树的数据结构,并进行了一些调整
- MyISAM叶子节点不存储真正的数据,而是存储其数据的指针
- MyISAM索引属于非聚集索引
2.2 InnoDB存储引擎索引
- MySQL InnoDB的数据文件和索引文件为同一个
2.2.1 聚集索引
- InnoDB的聚集索引是一个标准的B+树
- 其叶子节点存储的真实的行记录
- 当行记录过大时,会将数据存储在别的数据页,然后叶子节点存储部分列数据以及指向其余数据的指针
- InnoDB肯定会有一个列充当聚集索引
- 当创建表是指定主键时,主键为聚集索引
- 未指定主键时,选定唯一索引为聚集索引
- 没有唯一索引时,innodb生成rowid充当聚集索引
2.2.2 非聚集索引
除了聚集索引,InnoDB还可以创建辅助索引提升查询效率
辅助索引又称为非聚集索引
InnoDB的辅助索引也采用B+树数据结构,但其叶节点存储的是主键值,而非真实数据
- 拿到主键值后,通过回表的方式在聚集索引检索匹配数据
2.2.3 联合索引数
- 联合索引为给多个字段创建索引
- 其排序规则为依次按照字段的顺序进行排序
- 上一个字段相同时按照下一个字段进行排序
- 按照联合索引的排序规则得出,查询时的查询条件需要严格按照联合索引的字段顺序给出,当查询条件中缺失某个索引字段时,从该字段起,不能通过索引查询
- 以上为最左前缀匹配原则
2.2.4 hash索引
- 与hash索引数据结构一致,但是其值存储的是主键值
- 然后拿到主键值后再进行回表查询
相关文章:

MySQL索引数据结构
目录 1 索引常用的数据结构 1.1 二叉树 1.2 平衡二叉树 1.3 红黑树 1.3 Hash表 1.4 B树 1.4 B树 2 MySQL索引的数据结构 2.1 MyISAM存储引擎索引 2.2 InnoDB存储引擎索引 2.2.1 聚集索引 2.2.2 非聚集索引 2.2.3 联合索引数 2.2.4 hash索引 1 索引常用的数据结构 1.1 二叉树 二…...

C 语 言 --- 数 组 (1)
C 语 言 --- 数 组1 数 组定义一维数组语 法 格 式初始化完 全 初 始 化不 完 全 初 始 化省 略 数 组 大 小不 初 始 化使 用 memset 初 始 化 类 型访 问 元 素一 维 数 组 在 内 存 中 的 存 储 总结 💻作 者 简 介:曾 与 你 一 样 迷 茫,…...
[视频编码]rkmpp 实现硬件编码
mpi_enc_test的命令参数描述说明 命令参数的描述说明如下: 命令参数 描述说明 -i 输入的图像文件。 -o 输出的码流文件。 -w 图像宽度,单位为像素。 -h 图像高度,单位为像素。 -hstride 垂直方向相邻两行之间的距离,单…...

3D数字化:家居行业转型升级的关键驱动力
在科技日新月异的今天,家居行业正经历着一场前所未有的变革。从传统的线下实体店铺到线上电商平台的兴起,再到如今3D数字化营销的广泛应用,消费者的购物体验正在发生翻天覆地的变化。3D数字化营销不仅让购物变得更加智能和便捷,还…...
网安知识点
1.SQL注入漏洞产生的原因是? 前端传到后端的数据,没有经过任何处理,直接当作sql语句的一部分来执行 2.讲一下sql注入,写入webshell需要哪些前提条件 开启导入导出权限secure-file-priv 站点根目录位置/路径 mysql用户对站点根目…...

天津大学02-深度解读DeepSeek:部署、使用、安全【文末附下载链接】
大模型风险与不当用例——价值观错位 大模型与人类价值观、期望之间的不一致而导致的安全问题,包含:• 社会偏见(Social Bias)LLM在生成文本时强化对特定社会群体的刻板印象,例如将穆斯林与恐怖主义关联,或…...
【kubernetes】service
目录 1. 说明2. 原理2.1 服务注册2.2 服务发现2.3 负载均衡 3. Service的类型3.1 ClusterIP3.2 NodePort3.3 LoadBalancer3.4 ExternalName 4. 使用场景 1. 说明 1.kubernetes中的service主要用于提供网络服务,并实现微服务架构中的几个核心功能:全自动…...

Python卷积神经网络(CNN)来识别和计数不同类型的工业零件
以下三种类型工业零件为例,使用卷积神经网络(CNN)来识别和计数不同类型的工业零件。以下是Python实现步骤: 数据准备:收集并标注包含不同形状(如方形、圆形、扇形)的工业零件图像数据集。 模型…...
MoonSharp 文档二
目录 6.Sharing objects 我们先来简单谈谈类型描述符 先说类型描述 稍微复杂一点 调用静态成员 应该使用 “:” 还是 “.” 重载 ByRef 参数(C# 中的 ref/out) 索引器 userdata 上的运算符和元方法 扩展方法 事件 关于 InteropAccessMode 的…...
android 支持自定义布局、线程安全、避免内存泄漏的 Toast 工具类
支持自定义布局:可以灵活地显示自定义样式的 Toast。 线程安全:确保在主线程中显示 Toast,避免崩溃。 避免内存泄漏:使用 ApplicationContext 和取消机制,防止内存泄漏问题。 工具类:作为一个通用的工具…...

景联文科技:以精准数据标注赋能AI进化,构筑智能时代数据基石
在人工智能技术席卷全球的浪潮中,高质量数据已成为驱动AI模型进化的核心燃料。作为全球领先的AI数据服务解决方案提供商,景联文科技深耕数据标注领域多年,以技术为基、以专业为本,致力于为全球客户提供全场景、高精度、多模态的数…...

Mysql的卸载安装配置以及简单使用
MySQL其它问题已经更新在:MySQL完善配置---可视化-CSDN博客 一、卸载 ①控制面板卸载 ②C盘隐藏项目>ProgramData>mysql相关文件夹,还有Program file下的MySQL文件夹 ③开始菜单栏搜索>服务,找到MySQL相关服务删除,如果再…...
使用 ResponseBodyEmitter 实现异步响应式数据流处理
1. 概述 1.1 什么是 ResponseBodyEmitter ResponseBodyEmitter 是 Spring MVC 提供的一个接口,用于支持异步返回响应数据流。它允许在控制器方法中逐步发送数据给客户端,而无需一次性生成完整的响应。 1.2 使用场景 实时数据推送(如股票行情、聊天消息等)。大量数据分批…...

Uniapp项目运行到微信小程序、H5、APP等多个平台教程
摘要:Uniapp作为一款基于Vue.js的跨平台开发框架,支持“一次开发,多端部署”。本文将手把手教你如何将Uniapp项目运行到微信小程序、H5、APP等多个平台,并解析常见问题。 一、环境准备 在开始前,请确保已安装以下工具…...
Ubuntu 下 nginx-1.24.0 源码分析 - cycle->modules[i]->type
Nginx 中主要有以下几种模块类型 类型 含义 NGX_CORE_MODULE 核心模块(如进程管理、错误日志、配置解析)。 NGX_EVENT_MODULE 事件模块(如 epoll、kqueue 等 IO 多路复用机制的实现)。 NGX_HTTP_MODULE HTTP 模块…...

基于SpringBoot的“文物管理系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“文物管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体功能模块图 E-R实体图 系统首页界面 系统…...

dify + ollama + deepseek-r1+ stable-diffusion 构建绘画智能体
故事背景 stable-diffusion 集成进 dify 后,我们搭建一个小智能体,验证下文生图功能 业务流程 #mermaid-svg-6nSwwp69eMizP6bt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6nSwwp69eMiz…...
Android原生gif动图加载AnimatedImageDrawable
Android原生gif动图加载AnimatedImageDrawable 从Android P(9.0)开始,Android系统支持gif动图的原生控件AnimatedImageDrawable,可以播放加载gif动图。 AnimatedImageDrawable官方文档链接: https://developer.andro…...

Windows 系统 Docker Desktop 入门教程:从零开始掌握容器化技术
文章目录 前言一、Docker 简介二、Docker Desktop 安装2.1 系统要求2.2 安装步骤 三、Docker 基本概念四、Docker 常用命令五、实战:运行你的第一个容器5.1 拉取并运行 Nginx 容器5.2 查看容器日志5.3 停止并删除容器 六、总结 前言 随着云计算和微服务架构的普及&…...

记录小白使用 Cursor 开发第一个微信小程序(二):创建项目、编译、预览、发布(250308)
文章目录 记录小白使用 Cursor 开发第一个微信小程序(二):创建项目、编译、预览、发布(250308)一、创建项目1.1 生成提示词1.2 生成代码 二、编译预览2.1 导入项目2.2 编译预览 三、发布3.1 在微信开发者工具进行上传3…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...