mysql索引底层数据结构和算法

MySQL索引底层数据结构和算法 索引是帮助MySQL高效获取数据的排好序的数据结构。 阅读详情

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

1. SELECT * FROM titles WHERE emp_no=‘10001’ AND title=‘Senior Engineer’ AND

from_date=‘1986-06-26’;

2. SELECT * FROM titles WHERE title=‘Senior Engineer’ ;

3. SELECT * FROM titles WHERE emp_no > ‘10001’;

4. SELECT * FROM titles WHERE emp_no > ‘10001’ and title=‘Senior Engineer’;

5. SELECT * FROM titles WHERE emp_no > ‘10001’ order BY title;

图片.png

索引到底是什么

索引是帮助 MySQL 高效获取数据的排好序的数据结构;

索引存储在文件里;

索引结构;

图片.png

二叉:

一个节点的左键点小于该节点,右节点大于该节点,但是如果插入二叉树的数据是有序的,就会形成二叉树的极端情况,形成链表,我们知道树的查询复杂度跟树的高度有关,树越高,那么查询事件复杂度就越高,并且需要更多的磁盘IO,所以需要通过某种约束来保证树的平衡,所以MySQL不用二叉存储索引;

二叉结构存储数据的示意图:

图片.png

红黑树:

那么红黑树就是平衡二叉树中的一种,它通过一系列的规则来保证树的平衡。但是在大规模数据存储的时候,红黑树常常会因为树的深度过高而导致磁盘IO读写过于频繁,导致效率底下,为什么会形成这种情况呢,我们知道要获取磁盘上的数据,必须通过磁盘移动臂移动到数据所在的柱面,然后找到指定盘面,接着旋转盘面找到数据所在的磁道,最后进行读写,这种涉及到物理操作情况下,性能自然会很低下。MySQL不用红黑树存储索引;

红黑树存储的数据示意图:

图片.png

HASH:

如果不是范围查找用hash效率也是很高的,hash索引查询单条确实比较快,但是他是无序的,查询多条或者排序的话性能就比较低了;

BTREE:

B树也就是B-树,B树是一个多路搜索树,也就是每个节点可以有多个子节点,这样是为了降低树的高度,减少磁盘IO次数;

B+树是B树的优化,他的子节点只存储键而不存储数据,数据全部存在叶子节点,并且叶子节点间通过指针进行连接,这样因为子节点不存储数据,那么磁盘可以一次读取更多的子节点,减少IO次数,并且叶子节点想通,如果想查询10-100的数据只需要找到头尾就可以了。

B-Trees示意图:

图片.png

B+Trees示意图:

图片.png

数据结构网站:

到此为止,我们知道了Mysql为什么使用B+树了,因为我们平常的业务查询一般可能不是查询一条,而是查询多条,hash索引查询单条确实比较快,但是他是无序的,查询多条或者排序的话性能就比较低了,并且在内存资源紧张的情况下,树索引可以分批装入内存进行计算。红黑树因为大数据存储下,树的高度很高,这样可能会导致多次IO,查询效率比较低。而B+树可以一次性装入更多的叶子节点到内存,并且树的高度可以控制到很低,叶子节点存储数据并且形成链表可以避免跨层查询。

索引概述

磁盘存取原理(一般使用磁盘I/O次数评价索引结构的优劣,一次磁盘io指指令一般是通知磁盘开始扇区位置,然后给出需要从这个初始扇区往后读取的连续扇区个数,所以树的层级越深磁盘io读取越频繁)

寻道时间 ( 速度慢,费时 )

旋转时间 ( 速度较快 )

[图片上传失败…(image-4d59c5-1652434397879)]

不同面上的磁道编号则组成了一个圆柱面

图片.png

磁盘IO为什么慢

先温习下知识点:磁盘IO时间 = 寻道 + 磁盘旋转 + 数据传输时间

从磁盘读取数据时,系统会将逻辑地址发给磁盘,磁盘将逻辑地址转换为物理地址(哪个磁道,哪个扇区)。 磁头进行机械运动,先找到相应磁道,再找该磁道的对应扇区,扇区是磁盘的最小存储单元(见图1-1)。

图片.png

 图1-1 磁盘物理结构

当需要从磁盘读取数据时,系统会将数据逻辑地址传给磁盘,磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址,即确定要读的数据在哪个磁道,哪个扇区。为了读取这个扇区的数据,需要将磁头放到这个扇区上方,为了实现这一点,磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间,然后磁盘旋转将目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间。

索引底层数据结构与算法

图片.png

图片.png

图片.png

图片.png

主键索引和辅助索引的区别?

逐渐索引:逐渐索引当做分叶子节点的值,行的记录被放到叶子节点上,索引和数据放到一起了。

辅助索引:辅助索引的value是主键索引的key,辅助索引通过b+tree找到主键索引,然后通过主键索引找到对应的行的记录;

为啥InnoDB必须有主键,并且推荐使用整型的自增主键?

1、如果设置了主键,那么InnoDB会选择主键作为聚集索引、如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引、如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增)。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

2、如果表使用自增主键
那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,主键的顺序按照数据记录的插入顺序排列,自动有序。当一页写满,就会自动开辟一个新的页,充分利用空间;

3、如果使用非自增主键(如果身份证号或学号或者uuid等)
由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页的中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。字符串长查询效率低,浪费空间,增加磁盘io

联合索引结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qm9fQIFE-1652434581669)(https://upload-images.jianshu.io/upload_images/27509882-82b3d26e6e488390.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

索引最左前缀原理?

图片.png

图片.png

按照最左前缀原理只有第三个sql走索引了

EXPLAIN SELECT * FROM employees WHERE NAME = ‘LiLei’ AND age = 22 AND POSITION =‘manager’;

EXPLAIN SELECT * FROM employees WHERE NAME = ‘LiLei’ AND POSITION =‘manager’ AND age = 22 ;

这两个都用到索引了,如果索引列都用到mysql会自动排序索引的

EXPLAIN SELECT * FROM employees WHERE NAME = ‘LiLei’ AND POSITION =‘manager’ AND age > 22 ;

这个是用到索引的

图片.png

有没有走索引的依据是type类型在all之前

依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL

一般来说,得保证查询达到range级别,最好达到ref

MySql——索引底层数据结构和算法 文章目录简介索引什么是索引MySql未使用二叉树MySql未使用红黑二叉树B-Tree B树B+Tree B+树 简介 Mysql是常用的数据库,本篇博客重点介绍索引和其相关的数据结构 索引 什么是索引 索引是帮助MySql高效获取数据的排好序的数据结构。 其中索引的数据结构分为:二叉树、红黑树、Hash表、B-Tree(B+树)等。 【问:】当无索引时,数据查找是怎么样的? 假设MySql中有如下所示的数据信息: 假设查询语句为: select * from t where t.Col2 = 89; 阅读详情

相关推荐

变压器耦合放大器(低频应用+高频应用)

变压器耦合放大器(低频应用+高频应用)

m0_54943120的博客 2275

MySQL调优-剖析MySQL索引底层数据结构与算法

MySQL调优-剖析MySQL索引底层数据结构与算法

Eriksen的博客 1203

`全网最细!! 入门必看Git教程链接:https://gitee.com/all-about-git`

全网 Git 入门教程 gitee.com。如果显示The requested URL returned error: 403错误,那就表示没有和window本地建立token令牌

qq_37855368的博客 3748

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

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

持续学习,坚持原创,分享技术笔记及经验。 688

4、基于球面波展开的近场/远场变换技术解析

本文深入解析了基于球面波展开的近场/远场变换技术,涵盖坐标系统选择、截断测量处理、高级SWE方法及实际应用场景。重点介绍了广义SWE、全探头补偿、平移SNF测量(TSWE)等关键技术,结合吸收材料与导电地板系统的误差处理方案,系统总结了各类方法的优缺点与适用场景,并通过流程图和案例分析展示了技术应用路径。该技术在汽车、通信和航空航天领域的天线测量中具有重要价值,可显著提升测量效率与精度。

dell8的博客 255

基于ESP32的智能停车场管理系统开发

智能停车场管理系统通过引入物联网(IoT)技术,实现对停车场内车辆的实时监控、空闲车位的管理、车辆的入场与出场控制等功能,大大提高了停车场的利用率和管理效率。通过集成物联网技术、云平台以及先进的传感器和执行器,系统不仅能实时监控停车场的车位状态,还能提供更好的用户体验。本文将介绍如何基于ESP32开发一个智能停车场管理系统,涵盖系统架构、硬件选择、软件开发以及最新技术的应用,帮助开发者实现高效的智能停车管理。ESP32的代码主要负责处理车位传感器的数据,控制LED指示灯的状态,以及与云平台进行数据交互。

2201_76125393的博客 912

mysql索引底层探索

分析以下几条 sql 的索引使用情况 1. SELECT * FROM titles WHERE emp_no='10001' AND title='Senior Engineer' AND from_date='1986-06-26'; 2. SELECT * FROM titles WHERE title='Senior Engineer' ; 3. SELECT * FROM titles WHERE emp_no > ‘10001'; 4. SELECT * FROM titles

zhiqiang_zhao 406

DAMMFND: Domain-Aware Multimodal Multi-view Fake News Detection

虚假新闻的泛滥不仅严重阻碍了互联网社交媒体的健康发展,还在政治、经济和社会层面造成了实际危害,凸显了自动化虚假新闻检测的重要性(Zhou 等,2015;Cui 等,2019;Zhu 等,2022a;Li 等,2024c,b,a)。现有的虚假新闻检测方法通常聚焦于特定领域的新闻,例如健康或政治领域。然而,在现实世界中,社交媒体上的新闻往往跨越多个领域,这就要求现有的虚假新闻检测方法必须考虑多域泛化(Nan 等,2021;Qi 等,2019;Zhu 等,2022b)。

qq_52053775的博客 337

如何计算 InnoDB 中 B+ 树索引的层高

如何计算 InnoDB 中 B+ 树索引的层高

wzy0623的专栏 519

【ArcGIS Pro微课1000例】0073:ArcGIS Pro3.5.2学习版下载及安装教程

ArcGIS Pro 3.5.2安装教程摘要:系统需Windows10及以上,8GB内存(推荐32GB)。安装步骤:1)安装.NET 8.0运行环境;2)执行主程序安装包,按向导完成基础安装;3)安装升级补丁;4)替换AfCore.dll文件并导入注册表。注意安装后删除临时文件节省空间。软件下载地址包含在百度网盘链接。安装过程需依次完成环境配置、主程序安装、补丁更新及破解步骤。

智慧空间实验室 1778

揭秘AI人工智能中Stable Diffusion的模型微调技巧

Stable Diffusion作为一种强大的文本到图像生成模型,在艺术创作、设计、娱乐等多个领域展现出了巨大的应用潜力。然而,其默认的模型输出可能无法满足特定用户或特定场景的个性化需求。本文章的目的在于深入揭秘Stable Diffusion的模型微调技巧,让读者能够根据自己的需求对模型进行定制化调整,生成符合特定风格、主题或要求的图像。范围涵盖了从基础概念到实际操作,从理论原理到项目实战的全方位内容,旨在为读者提供一个系统且深入的学习指南。

大模型应用工坊 949

深入理解Mysql -- 索引底层数据结构和算法(一)

哈希表是一种组合的数据结构, 它通常的实现方式存在下面两种, 它是一种牺牲空间去换时间的数据结构, 其核心是**哈希函数**, 哈希表最关键的冲突问题也取决于哈希函数的设计。数组 + 链表数组 + 红黑树哈希表特点一致性, 如果 a == b, 则 hash(a) = hash(b)高效性, 哈希函数计算高效简便均衡性, 哈希值均匀分布已存在的使用情况举例HashMap、TreeMap等JDK常用数据结构Redis的Hash数据结构。

yewandemty的博客 407

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MySQL索引底层数据结构和算法详解

MySQL索引的核心目的是高效定位数据,其底层实现依赖于多种精心设计的数据结构和算法。不同存储引擎和索引类型采用不同的实现方式。

m0_69378371的博客 1096

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Mysql索引底层数据结构和算法

【代码】Mysql索引底层数据结构和算法。

cxl0209的博客 202

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

mysql 索引底层数据结构和算法

一、基本内容 概念:MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度 常见的几种数据结构中,mysql为什么选择hash,B+Tree 2.1 二叉树 红黑树 hash BTree ...

炫炫的博客 406

深入理解MySQL索引的底层数据结构和算法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

不忘初心,奋勇前行 441

『Mysql进阶』Mysql 索引底层数据结构和算法(三)

索引底层数据结构和算法, 常用的索引结构有:Hash表,二叉树,平衡二叉查找树(红黑树是一个近似平衡二叉树),B树,B+树。

gorgor在码农 1584
上一篇: 严禁外传 字节跳动2022春招Java岗位架构师面试题(暂定版)发布
下一篇: 架构师必须要知道的阿里的中台战略与微服务
jvm大志
博客等级 码龄5年 3粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值