揭开MySQL索引神秘面纱(1)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL DuckDB 分析主实例,集群系列 8核16GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 揭开MySQL索引神秘面纱

文章目录

一、MySQL索引到底是什么

二、为什么要使用索引

三、Innodb为什么使用B+Tree而不使用BTree

1. Btree解析

2. B+Tree解析

3.Hash索引

4. B+Tree跟BTree区别

5. B+Tree适合做索引的原因

四、聚簇索引、非聚簇索引区别

五、表中存在多个索引数据是如何存储的

六、索引的几个技术名词

1. 回表

2. 覆盖索引

3. 最左匹配

4. 索引下推

七、索引存储在什么地方

八、总结

————————————————

你是不是对于MySQL索引的知识点一直都像大杂烩,好像什么都知道,如果进行深究的话可能一个也答不上来。


假如你去面试,面试官让你聊一下对索引的理解,然而你对索引的理解仅限于,检索数据就是快,是一种数据结构这个层面,那你就只能回家等通知了。


为了避免这种尴尬的事情发生,咔咔用时两天将索引的内容在自己理解的范围内进行整理,如整理的不全面可以在评论区进行补充和提建议。


一、MySQL索引到底是什么

相信大多数伙伴都买过技术类的书籍,看完没看完不知道,但是目录肯定看的次数最多。


看目录有没有自己目前的痛点,如果有就会根据目录对应的页码用最快的速度翻阅到相应内容位置。


那么在MySQL中同样也是这样的一个道理,MySQL的索引就是存储引擎为了快速找到数据的一种数据结构


同样在MySQL索引中又分了几种类型,分别为B-tree索引、哈希索引、空间索引、全文索引。


下文所有内容均在Innodb的基础上讨论。


二、为什么要使用索引

索引可以加快数据检索速度,这也是使用的索引的最主要原因。


索引本身具有顺序性,在进行范围查询时,获取的数据已经排好了序,从而避免服务器再次排序和建立临时表的问题。


索引的底层实现本身具有顺序性,通过磁盘预读使得在磁盘上对数据的访问大致呈顺序的寻址,也就是将随机的I/O变为顺序I/O。


这几点不理解就暂时先放着,继续看下文即可,会给你一个满意的解释。


任何事物都存在双面性,既然能提供性能的提升,自然在其它方面也会付出额外的代价。


索引是跟数据共存,因此会占用额外的存储空间。


索引创建和维护需要时间成本,这个成本随着数据量的增大而增大。


索引创建会降低数据的增、删、改的性能,因为在修改数据的同时还需要修改索引数据。


三、Innodb为什么使用B+Tree而不使用BTree

聊到这个问题那就必须得分清楚BTree、B+tree的区别,首先来看一下BTree


1. Btree解析

先来看一下BTree的数据结构是怎么样的,这里咔咔给提供一个网站地址https://www.cs.usfca.edu/~galles/visualization/Algorithms.html,可以看到关于数据结构的一些实现过程。


image.png


先来看BTree的数据结构,下图是咔咔已经将数据填充进去的。



image.png

这里有一个陌生区关于Max. Degree,这个你可以理解为阶,也可以理解为度。


例如现在这个值设置的是4,那么在一个节点中最多就可以存储三条数据,设置为5那就可以最多放4条记录。


现在可以看到目前只插入了三条数据。



image.png

那么再加一条数据,节点就会进行分裂,这个也就验证了当阶设置为n时,一个节点可存n-1条数据。


image.png


那接着再来插入几条数据看看。


image.png


想要达到快速检索数据,那就需要满足俩个特性,一个是有序,另一个就是平衡。


从下图中可以看到BTree是有一定的顺序性的,平衡性更满足,可以看上文中生成的第一张图。


image.png


那么在BTree中找一个值是怎么找呢!


例如现在要找一个值9,看一下寻找过程。


首先看到的数据是4,9是大于4的,所以会往4的右节点寻找。


继续找到范围在6到8的节点,9又大于8,所以还需要往右节点寻找。


最有一步就找到了数据9,这个过程就是BTree数据结构查找数据的执行过程。



image.png

了解到了BTree的数据结构后,我们在来看看在MySQL中关于BTree是如何存储的。


在下图中P代表的是指针,指向的是下一个磁盘块。


在第一个节点中的16、24就是代表我们的key值是什么。


date就是这个key值对应的这一行记录是什么。



image.png

那么此时想要寻找key为33的这条记录应该怎么找。


33在16和34中间,所以会去磁盘3进行寻找。


在磁盘3中进行判断,指针指向磁盘8。


在磁盘8中即可获取到数据33,然后将data返回。


那么在这个过程中到底读取了多少条数据呢!


在计算之前需要先了解一些知识点。


从MySQL5.7开始,存储引擎默认为innodb,并且innodb存储引擎用于管理数据的最小磁盘单位就是页。


这个页的类型也分为好几种,分别为数据页,Undo页,系统页,事物数据页。


一般说到的页都是数据页。默认的页面大小为16kb,每个页中至少存储2条或以上的行记录。


那么根据BTree数据查找的过程中可以得知一共读取了三个磁盘,那么每个磁盘的大小就是16kb。


而目前的给的案例寻找了三层,那么三层存储的数据就是16kb * 16kb * 16kb = 4096kb。


如果按照一条记录所需内存1kb,那么这三层的BTree就可以存储4096条记录。


各位数据库的数据少则几百万,多则几千万数据,那么BTree的层级就会越来越深,相对的查询效率也会越来越慢。


这个时候是不是应该思考一个问题,那就是为什么在Btree中48kb的内存怎么就只能存储4000多条记录


问题就出现在data上,要知道在计算数据大小时指针地址和key的内存都是没有计算在内的,单单就计算了data的内存。


因为在BTree结构中,节点中不仅存储的有key、指针地址还有对应的数据,所以就会造成单个磁盘存储的数据相对很少的原因。


为了解决单个节点存储数据量小的问题,于是就演变出另一种结构,也就是下文提到了B+Tree


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
5月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库索引的数据结构?
MySQL中默认使用B+tree索引,它是一种多路平衡搜索树,具有树高较低、检索速度快的特点。所有数据存储在叶子节点,非叶子节点仅作索引,且叶子节点形成双向链表,便于区间查询。
194 4
|
7月前
|
存储 关系型数据库 MySQL
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
|
5月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
142 2
|
6月前
|
存储 关系型数据库 MySQL
MySQL覆盖索引解释
总之,覆盖索引就像是图书馆中那些使得搜索变得极为迅速和简单的工具,一旦正确使用,就会让你的数据库查询飞快而轻便。让数据检索就像是读者在图书目录中以最快速度找到所需信息一样简便。这样的效率和速度,让覆盖索引成为数据库优化师傅们手中的尚方宝剑,既能够提升性能,又能够保持系统的整洁高效。
173 9
|
7月前
|
机器学习/深度学习 关系型数据库 MySQL
对比MySQL全文索引与常规索引的互异性
现在,你或许明白了这两种索引的差异,但任何技术决策都不应仅仅基于理论之上。你可以创建你的数据库实验环境,尝试不同类型的索引,看看它们如何影响性能,感受它们真实的力量。只有这样,你才能熟悉它们,掌握什么时候使用全文索引,什么时候使用常规索引,以适应复杂多变的业务需求。
193 12
|
8月前
|
SQL 存储 关系型数据库
MySQL选错索引了怎么办?
本文探讨了MySQL中因索引选择不当导致查询性能下降的问题。通过创建包含10万行数据的表并插入数据,分析了一条简单SQL语句在不同场景下的执行情况。实验表明,当数据频繁更新时,MySQL可能因统计信息不准确而选错索引,导致全表扫描。文章深入解析了优化器判断扫描行数的机制,指出基数统计误差是主要原因,并提供了通过`analyze table`重新统计索引信息的解决方法。
227 3
|
3月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
155 3
|
3月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
3月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。

推荐镜像

更多