一文让你对mysql索引底层实现明明白白

开篇:
图片是本人随笔画的,有点粗糙,望大家谅解,如有不对的地方,请联系我们,感谢

一、索引到底是什么
.索引是帮助mysql高效获取数据的排好序的数据结构

.索引是存储在文件里的

.数据结构: 二叉树 HASH BTREE

如果没有索引的话,循环一条一条的找,找一次就是一次IO,这样速度就会很慢

我们知道数据库数据都是存在磁盘上的,当我们查找数据时,就会从磁盘上取数据,每取一次就是一次IO,IO是非常耗时的,为了速度快会把数据放到缓存里,然后在缓存里进行操作

二、磁盘存取原理

当查找数据的时候,就是磁头循环找此道,就会一直循环查找,一次查找就是一次IO,IO是很耗时的

三、Mysql数据结构详解
就拿上面的7条数据来说,如果没有索引,当我们查找第7条数据时,就会循环7次,如果有百万级别的数据,那么就会查找百万次,显然这样是不行的,就需要数据结构算法来优化,那我们就从二叉树----HASH—BTREE来一一说起

二叉树:

二叉树节点保存的都是单个索引,高度会随着数据增大而增高,但是比一条一条的循环会快

不用二叉树是因为的极端情况下会出现单边增长,这样在数量大的情况下,和一条一条查找没有区别。

红黑树:

红黑树有自平衡性质,不会出现单边增长,它会动态自旋转,在性能上比二叉树又高一点,但是mysql也没有用这种数据结构,因为数据量超大的情况下,数据高度也会一直增大,在最终这个树高度也非常大,解决不了根本问题

HASH:

hash算法一次就会定位到文件指针,速度快,但是还是没有用,如果范围查找的话就没有办法了,如果只是内存中的话,他的时间复杂度是O(1),速度会会很快,但是索引文件也是保存在磁盘上,而且hash是不连续的放在磁盘上的,这样查询起来也很慢,这才是不用hash的最根本原因

B-TREE:

相比上面的数据结构,b-tree增加了横向大小(度Degree),那么在高度上就减小了,查找次数就少了

15,56,77.。。。。是索引,data就是对应的一行数据

那么在横向的度上最大多少合适呢??总不能横向上一直扩展下呀,磁盘一次IO,就是取一个横向的节点(度),把一个节点的数据放在缓存中,那么一次IO也不能把所用的数据全取出来,所以最好是一次io,就把这个节点全取处理,电脑操作系统从磁盘一次取数据到内存中一般是4K,而mysql取一次数据一般是16K,所以横向节点一般设置为16K。因为一个节点设置成16K的话,这个节点保存了索引和索引对应行的数据,那么这个节点横向保存不了太多的数据,所以,这种数据结构也不合适,引入新的数据结构

B+Tree

查找一次数据就是和磁盘一次IO,一次IO会把这个数据相邻的数据一下全部查处理,这样速度会更快,这样的一页就是咱们说的一个节点(4K),分配空间的时候也是一页一页分配的,这样会更快,一页就是一个节点

mysql 常用的引擎有MyISAM和InNoDb,两种引擎得索引结构是不一样的

MyISAM的数据结构:

.frm表结构文件 .myd表数据文件 .myi表索引文件

myisam引擎的主键索引数据结构是左上图,普通索引是右上图,叶子节点存的不是数据本身,是数据文件指针,和b_tree数据不一样,注意:每类的索引,都是各自的树,不是混合在一起的

.frm表结构文件 .ibd 表数据和索引文件

主键索引是聚集索引,因为叶子节点是所有的数据,就是一行数据,非主键索引叶子节点只包括索引和主键,再用主键找对应数据

非主键索引叶子节点只包括索引和主键,再用主键找对应数据,这样是为了节省空间和数据一致性

联合索引:

要满足最左原则

联合索引(col1, col2, col3)也是一棵B+树,其非叶子节点存储的是第一个关键字的索引,而叶子节点存储的则是三个关键字col1、col2、col3三个关键字的数据,且按照col1-col2-col3的顺序进行排序。

例如:

如果执行的是,SELECT * FROM T WHERE B=‘Tom’ AND C=4567;

那么无法使用索引,因为索引是用A字段先排序的,如果没有先确定A,直接查找B和C,那么将会是全表查询。

如果执行的是,SELECT * FROM T WHERE A=‘30’ ;

那么,会先找到A字段,再在A等于30的数据中(比如有很多条),找B等于Demi的数据。这样是可以用到索引的。

如果执行的是,SELECT * FROM T WHERE A=‘18’ AND C=1234;

那么,A字段可以索引,而C不能索引。所以可以部分索引,也比全表查询快。

如果执行 SELECT * FROM T WHERE B=Demi AND C=1234 and A=‘18’

是用到索引的,在and的情况下如果把第一个放到最后位置也是能用到索引的

现在我想大家应该了解了什么为什么是最左原则。因为,B+树是按照最左边的字段以此构建的。

作者:京东零售 韩航云

来源:京东云开发者社区 转载请注明来源

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序怎么引入webview的url是本地的路径

当微信小程序访问类似http://10.27.0.15:8065/#/my这样的地址的时候会出问题。但是我们也不能每次把写的H5的代码发布在看效果啊? 只需要修改一个地方就可以啦。

Transformer 位置编码

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

LLM(十)| Tiny-Vicuna-1B:Tiny Models轻量化系列Top One

在过去的一年里,见证了LLM的蓬勃发展,而模型的参数量也不断刷新记录,在2023年下半年,外界传言GPT-4是一个专家混合模型。因此,如果你想用人工智能做点什么,你需要IBM或NASA类似的计算能力:你怎么…

JAVA进化史: JDK16特性及说明

JDK 16于2021年3月发布。这个版本引入了一些新特性和改进,以下是其中一些主要特性 JEP 338: 引入了向量API(Vector API) 引入了向量API(Vector API),这是一个孵化器特性,用于提供更好地利用硬…

openharmony 编译LLVM编译器基础架构

1. 编译库地址 third_party_llvm-project: 管理员 liwentao_uiw dhy308 huanghuijin 2. 编译方法 git clone https://gitee.com/openharmony/third_party_llvm-project.gitcd third_party_llvm-projectmkdir buildcd buildcmake -G Ninja -DCMAKE_BUILD_TYPERelease ../llvm …

纯c++简易的迷宫小游戏

一个用c写的黑框框迷宫 适合新手入门学习 也适合大学生小作业 下面附上代码 总体思路 初始化游戏界面:设置迷宫的大小(WIDTH和HEIGH),生成迷宫地图(map),包括墙壁、空地、起点和终点。显示…

3、python布尔类型和条件表达式

使用布尔值进行分支逻辑! 文章目录 1.布尔类型1.1比较运算1.2组合布尔值2.条件语句2.1布尔转换1.布尔类型 Python有一种称为bool的变量类型。它有两个可能的值:True和False。 In [1]: x = True print(x) print(type(x)) True <class bool>除了直接在代码中使用True或…

【K12】Python写串联电阻问题的求解思路解析

问题源代码 方法&#xff1a;calculate_circuit_parameter 构造题目&#xff1a; 模板&#xff1a; 已知电阻R1为 10Ω&#xff0c;电阻R2为 5Ω&#xff0c;电压表示数为2.5V&#xff0c;求电源电压U&#xff1f; 给合上面题目&#xff0c;利用Python程序&#xff0c;可以任…

LeetCode 76.最小覆盖子串Java

题目链接 这个是滑动窗口问题比较难的了&#xff0c;不太好想。 我借鉴了这个大佬的思想&#xff0c;用更容易理解的方式实现了一下&#xff0c;可能时间复杂度有点提高。 代码搭配详解使用&#xff1a;题解 这个是我的题解 class Solution {public String minWindow(String …

【论文笔记合集】卷积神经网络之深度可分离卷积(Depthwise Separable Convolution)

本文作者&#xff1a; slience_me 我看的论文地址&#xff1a;MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 内容 1. 标准卷积 假设输入为DFDFM&#xff0c;输出为输入为DFDFN&#xff0c;卷积核为DKDKM&#xff0c;共有N个卷积核进…

人机对话:程序设计,学哪种语言好?

人机对话&#xff1a;程序设计&#xff0c;学哪种语言好&#xff1f; 程序设计&#xff0c;学哪种语言好&#xff1f;学习目的&#xff1a;职业发展&#xff1a;个人兴趣&#xff1a; go语言怎么样&#xff1f;优点&#xff1a;缺点&#xff1a; 要开发手机APP&#xff0c;还需…

LeetCode刷题---随机链表的复制

解题思路&#xff1a; 使用哈希表来解决该问题 因为题中要求是深拷贝 首先对原链表遍历&#xff0c;将原链表每个节点和新链表每个节点形成对应关系&#xff0c;存入到哈希表中&#xff0c;key为原链表的节点&#xff0c;value为新链表的节点。 之后重置辅助链表指向原链表头节…

墨刀原型-实现轮播图功能

在墨刀中实现轮播图效果&#xff0c;可以按照以下步骤进行操作&#xff1a; 1.添加轮播图组件&#xff1a;在墨刀的组件面板中&#xff0c;找到轮播图组件并将其拖拽到画布上。 2.上传轮播图&#xff1a;在右侧的属性面板中&#xff0c;你可以上传你的轮播图图片。点击“”按钮…

动态pv(nfs方式挂载)

1、定义 发布pvc之后可以生成pv&#xff0c;还可以在共享服务器上直接生成挂载目录 pvc直接绑定和使用pv 2、动态pv依赖两个组件 &#xff08;1&#xff09;provisioner卷插件&#xff1a;k8s本身支持的动态pv创建不包括nfs&#xff0c;需要声明和安装一个外部插件provisio…

NET Core发布 HTTP Error 500.31 - Failed to load ASP.NET Core runtime

记录一下踩过的坑&#xff1a; 首先&#xff0c;不论是500.31还是500.30 &#xff0c;首先确保安装了三个文件 1.NET Core RunTime 2.NET SDK 3.NET Hosting 其次&#xff0c;确保三个文件的版本一致&#xff0c;如下&#xff1a; 要装就统一装同一个大版本&#xff0c;不要东…

Linux第28步_编译“修改正点原子TF-A源码中的Makefile并编译生成新的TF-A 固件”

了解学习内容&#xff1a; 1)、正点原子STM32MP157开发板使用的主控型号是STM32MP157DAA1&#xff1b; 2)、“linux /atk-mp1/atk-mp1/alientek_tf-a/tf-a-stm32mp-2.2.r1”目录下的文件是正点原子STM32MP157D开发板的“TF-A源码”。 3)、“linux /atk-mp1/atk-mp1/alientek…

字符串匹配

模板&#xff1a; KMP: 细节在代码中 看不懂的可以参照&#xff1a;如何更好地理解和掌握 KMP 算法? - 阮行止的回答 - 知乎 https://www.zhihu.com/question/21923021/answer/1032665486 package StringMatch.KMP;import java.util.ArrayList; import java.util.List;publ…

k8s的配置资源管理

Secret Secret用来保存密码、token密钥以及一些敏感的k8s资源。这类数据虽然可以存放在镜像当中&#xff0c;但是放在secret当中可以更方便控制。减少暴露的风险。 Secret的作用&#xff1a;保存加密的信息 Secret的类型 docker-registry()主要用于存储docker仓库的认证信息…

后台生成随机验证码验证登录

web get请求获取图片 <div class"p2"><img id"imgId" src"/get/code"><a href"#">看不清&#xff0c;换一张</a> </div> 后台代码: /*获取动态验证码*/ ResponseBody RequestMapping(value "/…

【MATLAB源码-第113期】基于matlab的孔雀优化算法(POA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 POA&#xff08;孔雀优化算法&#xff09;是一种基于孔雀羽毛开屏行为启发的优化算法。这种算法模仿孔雀通过展开其色彩斑斓的尾羽来吸引雌性的自然行为。在算法中&#xff0c;每个孔雀代表一个潜在的解决方案&#xff0c;而…