深入理解Mysql索引底层数据结构与算法

深入理解MySQL索引底层数据结构与算法 目录 一 理解索引的特性 二 索引的各种存储结构及其优缺点 (一)二叉树 (二)红黑树 (三)Hash (四)B-Tree (五) B+Tree(MySQL索引的真正存储结构) 三. 联合索引底层存储结构 一 理解索引的特性 索引是帮助MySQL高效获取数据的排好序的数据结构 索引存储在文件里 二 索引的各种存储结构及其优缺点 在开始讲这一小节之前,我们先来看一... 阅读详情

索引

索引是帮助MySQL高效获取数据的排好序的数据结构(容易忽略的点:排好序)(形象点就是教科书的目录)

索引存储在文件里(也就是说有IO操作)

索引结构:

这里说说在几种数据结构中,mysql为什么选择hash,B+Tree

  1. 二叉树
  2. 红黑树
  3. hash
  4. BTree

首先,如果数据没有索引,那么我们读取数据是这样的

这里有一篇很好的硬盘存取原理文章,看完更容易理解: https://www.cnblogs.com/leezhxing/p/4420988.html 

上面我们发现读取数据特别耗时,那有没有比较节时的数据结构,我们可以看看二叉树 

 上面虽然优化了,但是mysql为什么选择 B+Tree

这里介绍一个动态演示数据结构的网址:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

二叉树与红黑树的比较

从上面我们发现,红黑树相比较于二叉树又进步了一些,但红黑树还是有些问题:那就是数据量大的话,红黑树的深度会很深,也就是说深度不可控,这样一来查找数据还是会很耗时

HASH

从上面我们发现,相比较于红黑树,hash可以固定“深度”,且映射到磁盘存储引用,这样查找数据直接告诉磁盘数据在哪,查找数据也挺快的,但是 hash 还是有些不足:那就是不能范围查找,比如我们查找Col1>1的数据,当然如果我们查询操作很少的话,我们也可以选择hash数据结构,因为它查找数据挺快的,这也是mysql的索引方法除了B+Tree还有hash

BTree

 从上面看,我们发现BTree又进步了一些,查询速度提高,存储容量也没影响到。当然有人可能会这样想,那我们为什么不把数据全部都存在一个节点,这样深度不就是1了吗?

当然不行了!java拿取数据一般是这样的:java程序-->CPU--->内存---->硬盘,而内存与硬盘的交互是有大小限制的,是一页数据4k左右,所以不能把所有数据都放在一个节点来获取,一般来说节点会尽量预存4K容量。

看到这里,我们知道(4K=节点;节点=小节点*小节点的容量)一个节点是4K,而节点内有几个小节点,那么也就是说,只要我们每个的小节点的data容量越小,那么可以存的节点也就可以更多。

B+Tree

B+Tree通过把data不放在非叶子节点来增加度(小节点),一般会一百个以上使得深度是3~5,从而减少查询次数。并且,叶子节点之间会有指针,数据又是递增的,这使得我们范围查找可以通过指针连接查找,而不再从上面节点往下一个个找。

结论:B+Tree 既减少查询次数又提供了很好的范围查询

 MyISAM索引实现(非聚集)

  MyISAM索引文件和数据文件是分离的,文章一开始也介绍了,数据.MYD+结构.frm+索引.MYI三个文件

 那myisam的索引是什么样的?

InnoDB索引实现(聚集)

  • 数据文件本身就是索引文件
  • 表数据文件本身就是按B+Tree组织的一个索引结构文件
  • 聚集索引-叶节点包含了完整的数据记录
  • 为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?
  • 为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

上面的问题对应字体颜色说明 (可能说的有些乱,可以参考这个的描述:https://baijiahao.baidu.com/s?id=1567647881305129&wfr=spider&for=pc) 

联合索引的底层存储结构

注意:

最左原则不能简单的理解为10002,staff,1995 (b,c,d) 这个顺序,

如果是 where  d = 1994 and b = 10002 ,这个依然会走索引,因为可以走b = 10002这个,然后在

这个结果集再筛选出 d = 1994

如果是  where c = staff and d = 1994 ,那么这个不走索引,因为上面的树无法判断走哪个节点(因为索引是根据 b 先排序的)

所以 最左原则 强调的是命中 b 字段

范围查询导致走索引失败

 

如果是 select * from table where b > 1,那么它可能先查出 b = 1,然后取出7个,这时mysql引擎发现走索引后,还要根据这7个的主键取出 * 字段 数据,那个它还不如走全表扫描(如下图),他遍历

8个数据的同时可以返回 * 字段数据,可能效率更快

如果是select * from table where b > 5 ,它走索引,因为mysql引擎发现>5只要取两个就行

总结:范围查询不一定导致索引失败,因为mysql优化器会优化,具体还是要用 explain看它的执行计划

练习题

在employee表建联合索引 (emp_no,title,from_date)

分析以下几条sql的索引使用情况

SELECT * from employee where emp_no = '10001' and title = 'xxx' and from_date = '2018-10-01 11:29:51'

SELECT * from employee where title = 'sss'

SELECT * from employee where emp_no > '10003'
 
SELECT * from employee where emp_no > '10003' and title = 'eeee'

SELECT * from employee where emp_no > '10003' ORDER BY title

#自己可以根据联合索引的数据结构猜猜看

也可以用explain来查看

【MySQL】深入理解MySQL索引底层数据结构与算法 索引是帮助MySQL高效获取数据的的。排好序这三个字其实就是对索引最好的形容和体现。我们可以简单把索引比喻成为书本的目录页,当然这么说太过于抽象,并没有把索引的底层特性说明白,下面我们将依次分析这些数据结构,来说明索引究竟是什么?! 阅读详情

相关推荐

OCR开发车架号识别vin码识别系统

一、vin码识别车架号识别系统简介   vin码识别车架号识别系统,结合VIN码主机厂数据库及自身多年文字识别经验,针对机动车配置参数等信息的查询及采集业务推出的一款VIN码自动识别产品。   车架号识别vin码识别,主要应用在智能手机IOS与Android两个平台中。前端扫描查询模式,无需联网,只需扫描汽车前挡风玻璃右下角的VIN玛(车架号),即可轻松识别出车辆产地、品牌、车

OCR13512721355的博客 1433

mysql底层数据结构

mysql数据结构

Aarstg的博客 2857

快速了解Spyder

一 面板介绍菜单栏:放置所有功能工具栏:放置快捷菜单,可以通过菜单栏中的View的Toolbars的复选框来勾选工作区:写代码的地方属性页的标题栏:可以显示当前代码的名字和位置查看栏:查看文件、调试时的对象及变量输出栏:查看程序的输出信息,也可以作为shell终端来输入Python语句状态栏:用来显示当前文件权限、编码,光标指向位置和系统内存二 注释功能注释功能为编写代码很常用功能,下面介绍Spy...

实践求真知 1万+

mysql原理(1) mysql底层数据结构

一、前言 1.1 索引结构及查找算法 一个sql语句在mysql里究竟是如何运行的呢?又是怎么去查找的呢? 其中就涉及到数据库(存储数据)以及查找算法。 先来看一下几种查找算法; 目录查找:类似索引 遍历:暴力查找 二分:B+树的基础算法 键查找:hash查找 能做索引的数据结构有:数组、链表、红黑树、B树(B-树、B+树)。 那么哪种数据结构适合做 MySql 数据库的存储结构呢? 先来说下数据的一般存储方式:内存(适合小数据量)、磁盘(大数据量)。 磁盘的运转方式:速度 + 旋转,磁盘页

babyZeng 6212

双斜率积分ADC:高精度测量中的经典选择与TC530/TC534实战指南

模数转换器(ADC)是连接模拟世界与数字系统的关键桥梁,其核心任务是将连续的模拟信号转换为离散的数字量。在众多ADC类型中,双斜率积分ADC以其独特的原理脱颖而出,它通过积分与反积分的线性过程,用时间换取精度,实现了对噪声的卓越抑制和极高的线性度。这种技术价值使其在对抗工频干扰、追求长期稳定性的场景中无可替代,尤其适用于精密测量仪表和工业传感器信号采集。本文聚焦于双斜率积分ADC的经典代表TC530与TC534,深入剖析其工作原理、关键参数如积分电阻、积分电容的选择,并提供从硬件电路设计到软件驱动的完整实战

weixin_30847063的博客 359

C++实现SM4国密算法实战指南

通过以上实现,开发者可以快速在C++项目中集成SM4国密算法,满足金融、政务等领域的安全需求。实际部署时建议通过国家密码管理局的合规性检测,并定期更新密钥管理策略。库(支持国密算法),需提前安装并配置开发环境。

skyksksksksks的博客 1487

Mysql数据结构

mysql底层数据结构,

lichaofan1的博客 4622

CoaXPress FMC子卡:高速图像采集与FPGA原型开发实战指南

在机器视觉和工业检测领域,高速、可靠的数据传输是核心需求。CoaXPress(CXP)协议作为一种基于同轴电缆的高速接口标准,通过其高带宽、长距离传输和低延迟的特性,有效解决了传统接口在确定性实时传输方面的短板。其技术价值在于为海量图像数据提供了稳定、高效的物理层和数据链路层解决方案,广泛应用于半导体检测、医疗成像等对吞吐量有极致要求的场景。要实现CXP系统的快速原型验证,集成了高速SerDes接口和时钟管理的FMC子卡与FPGA开发板的组合成为关键。这种平台将复杂的硬件设计封装,让开发者能聚焦于图像处理算

weixin_31815843的博客 278

Mysql底层数据结构学习总结

Mysql底层数据结构学习总结

weixin_45161367的博客 3428

由异常的测试眼图引发的深入思考

信号测试中出现“双眼皮”的眼图测试效果,可能的导致因素总结如下:PCB通道阻抗设计不匹配,负载端出现严重反射;发射端采用了不当的信号预处理;接收器均衡处理不当;通道串扰严重... 基于以上的假设,本文就逐一分析下这些因素到底是如何对正常的信号眼图造成影响的。

一只豌豆象的博客 3063

系规备考论文:论IT服务规划设计

系规备考论文:论IT服务规划设计

liuxu324的博客 1144

mysql的底层数据结构组成

定义:本身就是一种特殊的二叉树,每个节点上都有存储位表示节点的颜色,可以是red或black 约束:每个节点是黑色或者红色,根节点为黑色,叶子节点(特指空节点)是黑色,每个红色节点的子节点都是黑色的,任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同 特点:速度特别快,趋近平衡树,查找叶子元素最少和最多次数不多余二倍。B树(B-tree)每个节点都存放了真实的数据,mysql一个根节点数据存储为16KB,会导致每一个节点存储的数据量变小,所以B树的高度会变高,维护的代价大,查询修改性能会越来越低。

m0_70208894的博客 1325

红队攻防渗透技术实战流程:云安全之云原生安全:特权模式和挂载模式

红队云攻防实战1. 什么是云 1. 什么是云

HACKONE的博客 573

深入理解MySQL索引:底层数据结构与算法详解

在数据库操作中,磁盘I/O是一个关键的性能瓶颈。B+Tree通过减少磁盘访问来优化这一点,特别是在处理大量数据的查询时数据库索引常常需要处理范围查询(例如,查找某个区间内的所有记录)。B+Tree的结构使得这类查询非常高效由于叶子节点之间是相互连接的,B+树非常适合快速顺序访问数据,这在数据库中是一个常见需求B+Tree的内部节点不存储数据,这使得每个节点可以存储更多的键。这种结构也更加缓存友好,因为它允许更多的节点保留在内存中,减少了磁盘访问。

likunxing的博客 1813

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【MySQL】深入理解Mysql索引底层数据结构与算法

MySQL索引没有用B Tree,而是用B+Tree——B树的变种,有比B树更高的查询效率。

Mr_Wang_YF的博客 569

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

性能调优——14 深入理解MySQL索引底层数据结构与算法

索引数据结构详解、千万级数据表如何用B+树索引快速查找、聚集索引&聚簇索引&稀疏索引到底是什么?为什么DBA总推荐使用自增主键做索引?联合索引底层数据结构又是怎样的?Mysql最左前缀优化原则是怎么回事?索引失效怎么避免?

念头通达 1078

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

十四、深入理解Mysql索引底层数据结构与算法

叶节点具有相同的深度,叶节点的指针为空。所有索引元素不重复。节点中的数据索引从左到右递增排列。

Evan's Blog ٩(๑❛ᴗ❛๑)۶ 1376

《Mysql基础》-- 深入理解MySql索引底层数据结构与算法

深入理解MySql索引底层数据结构与算法 2021-05-16 10:59:06 一、索引本质 1、索引的本质 select * from t where col2 = 89 我们插入到数据表中的数据,有可能分布存储在磁盘不同的空间中,而我们的数据库查询的时候每次都要进行磁盘IO。当我们不加索引的时候,此时查询就是全表扫描,即一行一行的比对数据,多次进行磁盘IO,直到查询到我们所需的数据。 而我们所能想到的优化,自然是减少磁盘IO。而减少磁盘IO,我们自然是要减少数据比对的次数,.

lmj3732018的博客 9672
上一篇: Nginx 负载均衡演示之 upstream 参数 & location 参数
下一篇: Mysql的explain详解
caijunsen
博客等级 码龄10年 29粉丝 52原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值