MySQL索引理解(读懂此文章包你理解索引)

本文详细介绍了MySQL索引的工作原理,包括B+树的选用原因,以及索引相关问题的理解。通过实例展示了索引如何加速数据访问,解释了回表与索引覆盖的概念,并探讨了最左匹配原则。最后,文章通过实际查询示例解释了索引的使用情况。
摘要由CSDN通过智能技术生成

MySQL索引理解(读懂此文章包你理解索引)

前言

相信对于索引大家并不陌生,索引是一个庞大的知识体系,数据库、ES、文件索引、搜索引擎等等。
本篇文章将帮助你MySQL索引,希望会对很多人有所帮助。
废话不说,开撸。

提示:以下是本篇文章正文内容

一、索引是什么?

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。
简单的说就是为了加快数据访问

1.索引设计

数据存放在磁盘中,读取数据会把磁盘数据写入到内存中,从内存中读取数据这个操作就是IO,硬件上来讲换固态(满满的金钱),作为一名软件工程师我们能做的优化就是减少数据量,减少访问次数。甚至可以说能不能直接取到具体位置直接从磁盘获取对应数据,这就需要索引了。
一句话就是尽可能让其快速的定位到一行数据在磁盘或者文件中的位置。

那么问题来了如何快速定位呢?

很简单使用K-V就可以实现。
在这里插入图片描述

K:存放哪个文件,V:就是偏移量
在这里插入图片描述

二、MySQL为什么选用B+树?

key-value格式首先你会想到哈希表,见下图示例:
在这里插入图片描述
使用哈希会有几个问题:
1、hash会存在hash碰撞和hash冲突,需要设计比较好的hash算法。
2、对于内存比较依赖。
3、不支持范围查询,只能挨个对比。

(但是MySQL中是存在hash索引的,适用于memory这样的存储引擎,而且innodb存储引擎支持自适应hash)

而数据库是属于联机事务处理,要求支持业务场景,在最短时间内返回对应数据,所以显然可以支持范围查询更好,支持范围查询那就要有序,因此选用二叉树。
左叶<根<右叶,这样在检索时候如果值大于根节点那么找右边就行,小于就找左边实现了二分查找
对于二叉树又有如下几种二叉树:
在这里插入图片描述
BST树:如果插入数据一直递增或者递减,那么依据二叉树规则就会变成只有右边或者只有左边,那就有可能退化成链表了,又需要挨个对比查询。

AVL树(严格):二叉平衡树,在进行插入时候会进行旋转操作,保证左右两棵树尽可能平衡,平衡的规则是左子树跟右子树高度差不能超过1。
但是在插入的时候会进行N次旋转,会导致插入性能降低以此来换取查询速度的高效。

红黑树(非严格):也是一种二叉平衡树,但是平衡规则是最长子树只要不超过最短子树的2倍即可。
随着数据得插入,树会越来越深,io次数会逐渐增多。

B树与B+树都是矮胖的,比如四阶B树一个节点可以包含最多3个值,超出会分裂产生新得根节点,两者的区别就是B+树中叶子节点包含所有值,而B树每个节点都有值所有节点组成一个树。
下面为演示图方便大家理解:
4阶B树:
在这里插入图片描述
B+树图如下:
在这里插入图片描述

B树适合磁盘跟内存交互的应用场景的数据读取,大部分索引使用的都是B树完成的。
方便理解的动态树生成演示网站:
二叉树演示

三、对于索引相关问题的理解

这一章主要是想帮助大家更好的理解索引的问题概念。
在这里插入图片描述
继续撸:
1.一个表中可以有多少个索引?
答案:N个。
2.如果有多个索引的话,那么数据存储几份?
答案:数据只存储一份,不会有大量的数据冗余存在。
3.如果只存一份数据那么其他索引如何查找数据呢?
答案:在进行数据插入时,必须要跟某一个索引列相关联存储的,索引列的选择依托于下面顺序,有主键,用主键,没有主键,用唯一键,没有唯一键用6字节的row_id代替。
其他索引的叶子节点不会存储数据了,而是存放跟数据绑定的索引的key。

案例:
假设,表中有id,name,age三个列,id是主键,name是普通索引。
select * from table where name = zhangsan;
查询过程如下:先根据name的值去name的B+树上读取id,再根据id去主键的B+树上读取整行的记录,这个过程叫做回表

回表:当查询数据的时候需要聚簇索引获取整行记录的过程。

select id,name from table where name=zhangsan;
查询过程如下:直接根据name的值去name的B+树上获取所有查询的列值过程称为索引覆盖

索引覆盖:在索引叶子节点中能获取到查询的所有字段,此时叫做索引覆盖。

例子:
id,name,age,gender
id是主键,(name,age)是组合索引
select * from table where name=?
select * from table where name=? and age=?
select * from table where age=?
select * from table where age=? and name=?
最左匹配表示从左向后开始进行数据查询,1,2,4会使用组合索引,在mysql会有优化器来对条件的执行顺序来进行调整因此4也会使用组合索引。

最左匹配:在某些应用场景中需要两个key或者多个key共同在组成索引的key。

例子:
select * from table where name = ? and age=?
没有索引下推之前,是这样执行的:
先根据name的值去磁盘(存储引擎)中获取对应数据行记录,将符合条件的数据加载到server层中,在server中根据age进行数据筛选。
能不能在存储引擎中直接根据name和age进行筛选。
根据name和age的值在存储引擎进行数据筛选,server层不做任何筛选操作这就是索引下推。

到这里可能会有人有疑问,聚簇索引是什么?
很简单只需要记住数据跟索引放再一起的就是聚簇索引。
在这里插入图片描述

到这里对于索引你是不是清晰了很多呢?那么请看如下演示:

建立表和索引:
在这里插入图片描述

然后查询发现结果:
在这里插入图片描述
这怎么用到索引了,这不是不符合最左匹配吗,但是确使用了组合索引。

在这里插入图片描述
这是因为表中所有列都有索引就会使用索引了。
所以要需要学习的还有很多,本文仅仅帮助理解,里面一些不熟悉的地方还请自行查询进行深入学习。
看到这里已经有很认真啦,奖励你一首歌:
在这里插入图片描述

这是本人第一次写文章,算是个学习笔记吧也希望可以帮助其他人,加油打工人

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值