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

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存储引擎索引
  • MySQLMyISAM存储引擎数据文件索引文件分离

  • 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 模块&#xf…...

基于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…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来&#xf…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

基于 TAPD 进行项目管理

起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...