【深入理解MySQL的索引数据结构】

文章目录

  • 🔊博主介绍
  • 🥤本文内容
    • 📕索引底层数据结构与算法
      • 📙索引数据结构
        • 📘二叉树
        • 📘红黑树
        • 📘Hash
        • 📘B-Tree
        • 📘B+Tree
      • 📙表在不同存储引擎的存储结构
        • 📘MyISAM存储引擎索引实现
          • 📚文件结构
          • 📚非聚集索引
        • 📘InnoDB存储引擎索引实现
          • 📚文件结构
          • 📚聚集索引
      • 📙为什么DBA总推荐使用整型自增主键做索引
      • 📙为什么非主键索引结构叶子节点存储的是主键值?
      • 📙MySQL最左前缀优化原则是怎么回事
  • 📥博主的话

🔊博主介绍

Java程序员廖志伟


📌文章目录

  • 🔊博主介绍
  • 🥤本文内容
    • 📕索引底层数据结构与算法
      • 📙索引数据结构
        • 📘二叉树
        • 📘红黑树
        • 📘Hash
        • 📘B-Tree
        • 📘B+Tree
      • 📙表在不同存储引擎的存储结构
        • 📘MyISAM存储引擎索引实现
          • 📚文件结构
          • 📚非聚集索引
        • 📘InnoDB存储引擎索引实现
          • 📚文件结构
          • 📚聚集索引
      • 📙为什么DBA总推荐使用整型自增主键做索引
      • 📙为什么非主键索引结构叶子节点存储的是主键值?
      • 📙MySQL最左前缀优化原则是怎么回事
  • 📥博主的话

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。💡在这个美好的时刻,本人不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

🥤本文内容

CSDN

📕索引底层数据结构与算法

📙索引数据结构

📘二叉树

二叉树数据结构

📘红黑树

红黑树的数据结构

📘Hash

Hash

  • 对索引的key进行一次hash计算就可以定位出数据存储的位置,很多时候Hash索引要比B+Tree索引更高效
  • 仅能满足 “=”,“IN”,不支持范围查询,hash冲突问题。
📘B-Tree

B树

  • 索引元素不重复
  • 从左到右递增排列。
📘B+Tree

B+树

  • 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
  • 叶子节点包含所有索引字段
  • 叶子节点用指针连接,提高区间访问的性能
  • 可以支持范围查询,有双向指针,假如查询Col1>30通过双向指针直接可以查询出来大于30的数据,而不是像B-Tree一样需要重新从根节点查询。

📙表在不同存储引擎的存储结构

📘MyISAM存储引擎索引实现
📚文件结构

表在不同存储引擎的存储结构

  • .frm结尾的文件:表结构文件
  • .MYD结尾的文件:数据文件
  • .MYI结尾的文件:索引文件
📚非聚集索引

假设查询Col1=30,这个时候会先去.MYI结尾的索引文件找到磁盘地址0XF3,然后再去.MYD结尾的数据文件获取这一行数据。索引和数据分开存储就叫做非聚集索引。
MyISAM存储引擎索引实现

📘InnoDB存储引擎索引实现
📚文件结构

InnoDB存储引擎索引实现

  • .frm结尾的文件:表结构文件
  • .ibd结尾的文件:数据和索引文件,按照B+Tree组织的一个索引结构文件
📚聚集索引

聚集索引
叶节点包含整行记录,例如Col1=30会把其他行(Col2、Col3)的数据放到一起,这就是聚集索引。从结构上来说,聚集索引直接就获取到了整行数据性能比非聚集索引效率更高。

📙为什么DBA总推荐使用整型自增主键做索引

前面提到 InnoDB存储引擎中.ibd文件必须要用B+Tree来组织索引结构。

  • 如果表里面有主键,那么就可以直接使用主键作为B+Tree来组织索引结构。
  • 如果表里面没有创建主键,它会从表中选择一列所以数据不重复的列作为主键。
  • 如果没有选到不重复的列,这个时候MySQL才会自增隐藏列作为主键。
  • 通常情况都会自己选择一列作为主键,而不是交由MySQL自增隐藏列,减少MySQL的工作。

选择整型效率更快。

  • 如果以字符串作为主键,那么要逐个字符对比ASCII码,这种工作模式在对比过程中,如果二个对比结果前面相同,就最后一个字符不相同,浪费的性能还是很高的。
  • 整型存储的空间更小,会节约硬件资源。

假设我先插入8后插入7,即非自增插入数据,这个B+Tree结果是如何变化的呢?
自增5/6/8这个大节点放满了,插入7
自增放不下了,进行拆分平衡

自增假设后面插入9/10这种自增的数据,B+Tree会直接往后面开一个节点,性能比对来说,肯定是自增的会高一些。

📙为什么非主键索引结构叶子节点存储的是主键值?

非主键索引结构叶子节点存储主键值的原因主要有两个:

  • 保持一致性:当数据库表进行DML(数据操纵语言,如INSERT、UPDATE、DELETE)操作时,同一行记录的页地址可能会发生改变。由于非主键索引保存的是主键的值,而非实际的数据记录,因此当数据记录发生移动或变更时,非主键索引无需进行更改,只需保持与主键值的对应关系即可,从而保持索引的一致性。
  • 节省存储空间:在InnoDB存储引擎中,数据本身已经按照主键索引的B+树结构进行存储。如果非主键索引也存储整行数据,那么每个非主键索引都会存储一份数据,这将导致大量的数据冗余和存储空间的浪费。而只存储主键值的方式可以极大地节省存储空间,因为主键索引已经包含了完整的数据记录。

非主键索引通过存储主键值,可以在查询时通过主键值快速定位到数据记录所在的位置,从而提高查询效率。

为什么非主键索引结构叶子节点存储的是主键值?

为什么非主键索引结构叶子节点存储的是主键值?为什么非主键索引结构叶子节点存储的是主键值?先用二级索引找到主键索引,然后使用主键索引回表去查询对应的数据。

📙MySQL最左前缀优化原则是怎么回事

MySQL最左前缀优化原则

  • 先对比name大小,比较字符大小,HanMeimei<Jeff
  • 然后对比age大小,比较年龄大小,30<31<32
  • 最后对比position大小,dev<manager
EXPLAIN SELECT * FROM employees WHERE name = 'Bill' and age = 31;
EXPLAIN SELECT * FROM employees WHERE age = 30 AND position = 'dev';
EXPLAIN SELECT * FROM employees WHERE position = 'manager';|

根据上述的联合索引,分析上述SQL,只有第一条SQL会走索引。

  • 联合索引遵循最左前缀原则,先使用name进行查找,这是name已经排好序了,直接可以查询。
  • 然后使用age去查找,发现30,31,32,28,22,30,30,这个是没有排序的,就走全表扫描了。
  • 后面就不会使用position继续查找了。

CSDN
🔔以上就是今天要讲的内容,阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

📥博主的话

🚀🎉希望各位读者大大多多支持用心写文章的博主,现在时代变了,🚀🎉 信息爆炸,酒香也怕巷子深🔥,博主真的需要大家的帮助才能在这片海洋中继续发光发热🎨,所以,🏃💨赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

关注我

  • 💂 博客主页: Java程序员廖志伟
  • 🌥 哔哩哔哩:Java程序员廖志伟
  • 🎏个人社区:幕后大佬
  • 👉开源项目:java_wxid
  • 🔖个人微信号SeniorRD

我是廖志伟
我是廖志伟
我是廖志伟

🎥经过多年在CSDN创作上千篇文章的经验积累,我已经拥有了不错的写作技巧,与清华大学出版社签下了四本书籍的合约,并将陆续在明年出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码–沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!

京东商城购买链接:https://item.jd.com/14152451.html

Java项目实战——深入理解大型互联网企业通用技术(基础篇)(计算机技术开发与应用丛书)京东商城购买链接:https://item.jd.com/14152451.html

Java项目实战——深入理解大型互联网企业通用技术(基础篇)(计算机技术开发与应用丛书)

京东商城购买链接:https://item.jd.com/14152451.html

Java项目实战——深入理解大型互联网企业通用技术(基础篇)(计算机技术开发与应用丛书)Java项目实战——深入理解大型互联网企业通用技术(基础篇)(计算机技术开发与应用丛书)
京东商城购买链接:https://item.jd.com/14152451.html

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【牛客】SQL206 获取每个部门中当前员工薪水最高的相关信息

1、描述 有一个员工表dept_emp简况如下&#xff1a; 有一个薪水表salaries简况如下&#xff1a; 获取每个部门中当前员工薪水最高的相关信息&#xff0c;给出dept_no, emp_no以及其对应的salary&#xff0c;按照部门编号dept_no升序排列&#xff0c;以上例子输出如下: 2、题目…

现代制造之3D打印技术进行零件加工

现代制造 有现代技术支撑的制造业&#xff0c;即无论是制造还是服务行业&#xff0c;添了现代两个字不过是因为有了现代科学技术的支撑&#xff0c;如发达的通信方式&#xff0c;不断发展的互联网&#xff0c;信息化程度加强了&#xff0c;因此可以为这两个行业增加了不少优势…

新iPadPro是怎样成为苹果史上最薄产品的|Meta发布AI广告工具全家桶| “碾碎一切”,苹果新广告片引争议|生成式AI,苹果倾巢出动

Remini走红背后&#xff1a;AI生图会是第一个超级应用吗&#xff1f;新iPadPro是怎样成为苹果史上最薄产品的生成式AI&#xff0c;苹果倾巢出动Meta发布AI广告工具全家桶&#xff0c;图像文本一键生成解放打工人苹果新iPadPro出货量或达500万台&#xff0c;成中尺寸OLED发展关键…

答辩PPT设计缺乏专业感?笔灵AI提供简洁且关键的幻灯片设计

在我原本的认知里面&#xff0c;答辩PPT是要包含论文各个章节的&#xff0c;在答辩时需要方方面面都讲到的&#xff0c;什么摘要、文献综述、实证分析、研究结果样样不落。但是&#xff0c;这大错特错&#xff01; 答辩PPT环节时长一般不超过5分钟&#xff0c;老师想要的答辩P…

紫光计算机项目卓越中心负责人孙宇受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 紫光计算机科技有限公司信息技术中心项目总监&卓越中心负责人孙宇先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“PMO卓越中心核心能力拆解与落地-用创新绘制新蓝图”。大会将于6月29-30日在北京举办&#xff0c…

【SpringBoot】解锁后端测试新境界:学习Mockito与MockMvc的单元测试魔法

文章目录 前言&#xff1a;Java常见的单元测试框架一.Junit5基础二.SpringBoot项目单元测试1.添加依赖2.SpringBoot单元测试标准结构3.SpringBoot单元测试常用注解 三.单元测试中如何注入依赖对象1.真实注入&#xff08;AutoWired、 Resource&#xff09;2.Mock注入2.1.前言2.2…

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (一)

基于LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; RAG 是未来人工智能应用的基石。大家并不是在寻求仅仅产生无意义反应的人工智能。而目标是人工智能能够从特定文档集中检索答案&#xff0c;理解查询的上下文&#xff0c;指导自己搜索其嵌入内容或…

python零基础知识 - 定义列表的三种方式,循环列表索引值

这一小节&#xff0c;我们将从零基础的角度看一下&#xff0c;python都有哪些定义列表的方式&#xff0c;并且循环这个列表的时候&#xff0c;怎么循环&#xff0c;怎么循环他的索引值&#xff0c;怎么拿到的就是元素值。 说完循环&#xff0c;我们会说一说关键的break和contin…

每周日发系统规划与管理师伴读脑图,今天是第4章

从第4章开始&#xff0c;系统规划与管理师的学习就正式步入了主题&#xff0c;考虑到我过去中断了2周&#xff0c;想必你的第4章教程已经看完了吧&#xff1f;

vi\vim编辑器

root用户&#xff08;超级管理员&#xff09; 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 在Linux系统中&#xff0c;拥有最大权限的账户名为&#xff1a;root&#xff08;超级管理员&#xff09; root用户拥有最大的系统操作权限&#xff0c;而普通…

JavaEE技术之MySql主从复制及mycat[了解,不讲]

文章目录 1. 主从复制1.1. 主从同步的原理1.2. 检查数据库远程访问权限1.3. 主从配置1.3.1. master配置1.3.2. slave配置1.3.3. 主库创建同步用户1.3.4. 从库配置主从关系1.3.5. 重置主从关系 1.4. 测试主从复制 2. Mycat2.1. Mycat简介2.2. MyCat读写分离原理2.3. 不废话&…

行业分析---马斯克的Tesla

1 背景 在前面的博文《行业分析---我眼中的Apple Inc.》中&#xff0c;笔者曾介绍过苹果公司的财报和商业。依然本着提升自己看公司的能力&#xff0c;尝试去分析相对熟悉的公司&#xff0c;看懂它的商业。在之前的博客《自动驾驶---Tesla之FSD简介》中&#xff0c;笔者也简单介…

商务英语口语成人考级外语培训之BECkao考级口语篇

在口语考试中&#xff0c;不管实际内容你能说出多少&#xff0c;但准备一些套话&#xff0c;至少还能撑撑场子你们说是不是&#xff1f; 内容阐述 描述事实 1.Im going to describe/present/explain/give you some information about... 2.Id like to say a few words about...…

《Linux运维总结:ARM64架构CPU基于docker-compose一离线部署rabbitmq 3.10.25容器版镜像模式集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&…

C#二维数组(矩阵)求伴随矩阵和逆矩阵

程序框架及winform窗体 窗体控件: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Matrix {internal class Algorithm_Gallery{// <summary>/// 计算 A[p,q] 位于 [,]temp 的块辅因子…

Python+PySpark数据计算

1、map算子 对RDD内的元素进行逐个处理&#xff0c;并返回一个新的RDD&#xff0c;可以使用lambda以及链式编程&#xff0c;简化代码。 注意&#xff1a;再python中的lambda只能有行&#xff0c;如果有多行&#xff0c;要写成外部函数&#xff1b;&#xff08;T&#xff09;-&…

我国吻合器市场规模不断扩大 国产化率有所增长

我国吻合器市场规模不断扩大 国产化率有所增长 吻合器是替代手工切除或缝合的一种医疗器械&#xff0c;其工作原理与订书机十分相似&#xff0c;可利用钛钉对组织进行离断或吻合。经过多年发展&#xff0c;吻合器种类逐渐增多&#xff0c;根据手术方式不同&#xff0c;吻合器大…

【激活函数--中】激活函数和阶跃函数的可视化及对比

文章目录 一、Python中绘制阶跃函数的图形二、实现和可视化Sigmoid函数2.1 Python实现2.2 可视化Sigmoid函数 三、比较Sigmoid函数与阶跃函数3.1 Sigmoid函数与阶跃函数的差异3.2 Sigmoid函数与阶跃函数的共同点 一、Python中绘制阶跃函数的图形 在Python中实现阶跃函数的代码…

Milvus中那些年重要的基本概念

Milvus是一款开源的云原生向量数据库&#xff0c;专为海量向量数据的存储、检索和管理而设计。它支持实时的向量相似度搜索&#xff0c;适用于各种AI和机器学习应用场景。以下是Milvus的一些基本概念&#xff1a; 非结构化数据 非结构化数据是指那些不遵循特定数据模型或格式、…

计算机毕业设计 | vue+springboot调查问卷管理系统(附源码)

1&#xff0c;研究目的 在进入21世纪以后&#xff0c;互联网得到了蓬勃的发展&#xff0c;电子问卷调查也开始逐渐流行起来。传统纸质问卷和电子问卷相比较后&#xff0c;传统问卷还存在很多弊端&#xff1a; 问卷分发起来比较困难&#xff0c;并且分发试卷耗费大量的金钱和时…