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索引数据结构一致但是存储主键
  • 然后拿到主键进行回表查询

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

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

相关文章

分布式锁—7.Curator的分布式锁一

大纲 1.Curator的可重入锁的源码 2.Curator的非可重入锁的源码 3.Curator的可重入读写锁的源码 4.Curator的MultiLock源码 5.Curator的Semaphore源码 1.Curator的可重入锁的源码 (1)InterProcessMutex获取分布式锁 (2)InterProcessMutex的初始化 (3)InterProcessMutex.…

【高级篇】大疆Pocket 3加ENC编码器实现无线RTMP转HDMI进导播台

【高级篇】大疆Pocket 3加ENC编码器实现无线RTMP转HDMI进导播台 文章目录 准备工作连接设备RTMP概念ENCSHV2推流地址设置大疆Pocket 3直播设置总结 老铁们好! 很久没写软文了,今天给大家带了一个干货,如上图,大疆Pocket 3加ENC编…

VS Code连接服务器教程

VS Code是什么 VS Code(全称 Visual Studio Code)是一款由微软推出的免费、开源、跨平台的代码编辑神器。VS Code 支持 所有主流操作系统,拥有强大的功能和灵活的扩展性。 官网:https://code.visualstudio.com/插件市场&#xff1…

Ubuntu-docker安装mysql

只记录执行步骤。 1 手动下载myql镜像(拉去华为云镜像) docker pull swr.cn-east-3.myhuaweicloud.com/library/mysql:latest配置并启动mysql 在opt下创建文件夹 命令:cd /opt/ 命令:mkdir mysql_docker 命令:cd m…

【MySQL】事务|概念|如何回滚|基本特性|MySQL事务隔离性具体怎么实现的

目录 1.为啥引入 2.是啥 3.如何回滚(日志) 🔥4.面试题:谈谈事务的基本特性 (1)原子性 (2)一致性(收入和支出相匹配) (3)持久性…

C语言中的选择结构:决策的艺术

目录 一、选择结构的概念与意义 二、if语句 1. 基本语法 2. 示例代码 三、if-else语句 1. 基本语法 2. 示例代码 3. 嵌套if-else语句 四、switch语句 1. 基本语法 2. 示例代码 五、选择结构的注意事项 1. 条件表达式的正确性 2. if-else语句的配对问题 3. switch…

【0013】Python数据类型-列表类型详解

如果你觉得我的文章写的不错,请关注我哟,请点赞、评论,收藏此文章,谢谢! 本文内容体系结构如下: Python列表,作为编程中的基础数据结构,扮演着至关重要的角色。它不仅能够存储一系…

SwanLab简明教程:从萌新到高手

目录 1. 什么是SwanLab? 1.1 核心特性 2. 安装SwanLab 3. 登录SwanLab账号(云端版) 4. 5分钟快速上手 更多案例 5. SwanLab功能组件 5.1 图表视图 5.2 表格视图 5.3 硬件监控 5.4 环境记录 5.5 组织协同 6. 训练框架集成 6.1 基…

TCP7680端口是什么服务

WAF上看到有好多tcp7680端口的访问信息 于是上网搜索了一下,确认TCP7680端口是Windows系统更新“传递优化”功能的服务端口,个人理解应该是Windows利用这个TCP7680端口,直接从内网已经具备更新包的主机上共享下载该升级包,无需从微…

【SegRNN 源码理解】【今天不水文系列】编码器部分理解

我来小小的理解一下: 首先,16 batchsize,60sequendcelength,7 个特征的通俗解释 16 个独立的样本,每个样本有 60 个连续的时间步及对应的标签值,每个时间步有 60 个特征 所以就是因为样本是随机从训练集…

【CUDA】Reduce归约求和(下)

目录 前言1. 优化技巧4:展开最后一个warp减少同步2. 优化技巧5:完全展开循环3. 优化技巧6:调节GridSize和BlockSize4. 优化技巧7:使用shuffle指令5. 拓展—CUDA工具链的使用结语下载链接参考 前言 学习 UP 主 比飞鸟贵重的多_HKL …

IDE集成开发环境MyEclipse中安装SVN

打开Myeclipse的help菜单----install from site 点击add弹出对话框 在输入框中输入对应内容 http://subclipse.tigris.org/update_1.10.x 点击OK之后,会刷新出两个选项,需要选中的 点击next,出现许可的时候选中同意,一直结束等…

如何计算两个向量的余弦相似度

参考笔记: https://zhuanlan.zhihu.com/p/677639498 日常学习之:如何计算两个向量或者矩阵的余弦相似度-CSDN博客 1.余弦相似度定理 百度的解释:余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估…

国产编辑器EverEdit - 宏功能介绍

1 宏 1.1 应用场景 宏是一种重复执行简单工作的利器,可以让用户愉快的从繁琐的工作中解放出来,其本质是对键盘和菜单的操作序列的录制,并不会识别文件的内容,属于无差别无脑执行。 特别是对一些有规律的重复按键动作,…

vue安装stylelint

执行 npm install -D stylelint postcss-html stylelint-config-recommended-vue stylelint-config-standard stylelint-order stylelint-prettier postcss-less stylelint-config-property-sort-order-smacss 安装依赖,这里是less,sass换成postcss-scss…

(最新教程)Cursor Pro订阅升级开通教程,使用支付宝订阅Cursor Pro Plus

一、如何使用Cursor ? 目前要使用Cursor - The AI Code Editor,直接去下载安装就可以了,不过基础版只能用两周,如果需要继续使用,就要订阅pro plus或者企业版了。 二、如何订阅Cursor Pro Plus ? 因为基础…

Cursor 使用经验,一个需求开发全流程

软件开发中 Cursor 的使用经验成为关注焦点,尤其是处理大型数据集的需求。用户提到“Cursor 使用经验,一个需求开发全流程”,但“Cursor”可能指数据库游标,涉及逐行处理数据。本文将详细探讨开发一个需求的完整流程,包…

vue2实现组件库的自动按需引入,unplugin-auto-import,unplugin-vue-components

1.使用ant-design-vue或者element-ui时,如何每个组件都去import导入组件,大大降低了开发效率,如果全局一次性注册会增加项目体积,那么如何实现既不局部引入,也不全局注册? 2.在element-plus官网看到有说明…

蓝桥杯备赛:一道数学题(练思维(同余的应用))

题目:请问由1-8组成的8位数中有多少个数字可以被1111整除? 首先这道题目看着很难,如果我们直接用代码做的话,也要跑很久,那能不呢想想有什么样的思路可以巧妙一点解开这道题目呢? 有的兄弟有的 这道题目的…

[Lc7_分治-快排] 快速选择排序 | 数组中的第K个最大元素 | 库存管理 III

目录 1. 数组中的第K个最大元素 题解 代码 2.库存管理 III 代码 1. 数组中的第K个最大元素 题目链接:215. 数组中的第K个最大元素 题目分析: 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要…