MySQL技术之旅-手把手叫你认识Innodb索引原理

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL技术之旅-手把手叫你认识Innodb索引原理

前言概述


索引就如同一本书一样,当用户希望检索海量数据中自己想要的数据信息的时候,例如:用户去查一些生僻的字的时候,最好的办法就是通过字典索引目录,去筛选范围最后定位到了我们想要的数据所在的页数。这样可以大大的提高我们的查询检索速度,所以,使用索引可以大大的提高数据库的检索数据的性能和速度。




正文介绍


如果说上面的前言概述,说的还是过于抽象的化以及不够深入的化,那么就让我们一起迈向MySQL的Innodb存储引擎的领域吧!想跟大家说明的是针对于SQL Server、Oracle、DB2、或者MySQL的MySiam存储引擎是不一定成立的,请大家不要混为一谈。




索引的介绍


众所周知,MySQL数据库的索引从物理结构上区分,主要分为聚集索引非聚集索引。在平时使用的的MySQL数据库中,创建索引的语句:


create [unique|fulltext|spatial] index index_name
[using index_type]
on table_name(colum [asc/desc]);
复制代码



创建索引


聚集索引


聚集索引一般不用我们专门的语句去做另外的生成,在Innodb存储引擎中,MySQL中的数据是按照主键顺序,那么聚集索引就是按照每张表的主键来构造一个B+树,因此每张表只能有一个聚集索引哦。此外聚集索引存储了行的数据信息,也就是聚集索引其本身就是一个数据,每一个B+树的叶子节点都是一行数据信息,此外数据的排序顺序也是按照聚集索引的顺序进行排序。



一般情况下,聚集索引默认就是主键索引,


非聚集索引


  • 复合索引:多个字段进行共同建立负责索引的功能。


  • 前缀索引:最左匹配原则,以最左边的元素建立索引。


  • 唯一索引:每个索引元素都是唯一的索引。


上面这几种索引类型,一般叫做辅助索引(二级索引),在这里我们叫做非聚集索引,它们的底层数据结构为B+树


如果我的表没有建立主键该怎么办呢?


每一个行数据都会存在隐藏字段,比如:ROW_ID、DELETE_SIT,会用ROW_ID来作为聚集索引,但是也不会立刻就会用,还会存在判断和其他字段进行控制。


  1. 如果没有主键,就会用一个唯一索引且非空字段进行作为主键,也就是聚集索引


  1. 如果也没有上述的字段及索引的话,就会用上述描述的隐藏字段:ROW_ID作为聚集索引


注意:针对于自增主键和uuid作为主键的区别,由于主键使用的是聚集索引,因为聚集索引是有序的,如果主键属于自增的ID的话,那么存储的位置肯定是相邻的磁盘位置,这样子的话写入性能很好,但是如果是UUID的话,如果频繁插入的话,就会存在频繁的移动寻址到不同的磁盘快,所以写入性能会很差!





索引原理


先来了一张主键的表,如下所示,pid是主键


pid name birthday
5 zhangsan 2020-12-12
8 list 2021-12-12
11 wangwu 2016-12-12
13 zhaoliu 2016-12-12


image.png


如图所示:分为上下两个部分,上部分为主键索引B+树,下半部分就是磁盘上而是的真是数据,当然执行下面的语句:


select * from table where pid = "11";
复制代码


那么执行过程:

image.png


如上图所示:从根节点开始,需要查找三次树操作可以定位到对应的实际数据信息但是如果不使用索引,那就要在磁盘上,进行逐行扫描,直到找到数据位置


所以可以看出来,如果速度非常快,但是如果存在着操作数据比如:新增数据、修改数据、删除数据。这种情况需要进行维护相关的索引数据对象因此我们引入了非聚集索引


create index table_index on table(name);
复制代码


此时结构图如下所示:

image.png


  • 可以看到存在了两个B+树的索引,采用了table的name建立了一个新的B+树非聚集索引,因此如果我们每增加一个索引,就会增加表的体积,占用磁盘存储空间


  • 但是请注意非聚集索引的叶子节点存储的不是完整的数据行,而只是存在了聚集索引的值(主键->属于聚集索引的值)+ 索引字段的数据值。

select * from table where name = "list1";


image.png


从上面可以看出,首先检索从非聚集索引树开始查询,然后找到了聚簇索引,然后在从聚集索引上找到整体的完整的数据行。



什么情况不去聚集索引树去查询?


如果我们采用了以下的SQL语句,与我上面的SQL语句比较,属于返回name字段。


select name from table where name = "list1";


image.png


如果上图红线所示,如果在非聚集索引树上找到了想要的数据,如果是这样子:属于覆盖所索引机制,就不会聚集索引树上去查询其他所有的数据信息。


所以hi到在聚集索引的情况下:select col > select * 的速度要快很多,也是因为覆盖索引提高了很高的性能哦,当然不仅于此,解析 * 也会消耗很多性能。


create index table_index on table(birthday);
复制代码


如果执行完上述的SQL以后会创建一个新的索引树。

image.png


检索方式及就是会同时去检索同时根据条件去检索这两个非聚集索引,然后在转到聚集索引上去查询所有的数据行。


注意:而且需要考虑的就是不能乱加索引哦,因为每加一个就需要多建立一个索引树,过多的索引树,再维护数据的时候就会越加复杂,会导致操作数据性能大大下降。











相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
379
分享
相关文章
Mysql的索引
MYSQL索引主要有 : 单列索引 , 组合索引和空间索引 , 用的比较多的就是单列索引和组合索引 , 空间索引我这边没有用到过 单列索引 : 在MYSQL数据库表的某一列上面创建的索引叫单列索引 , 单列索引又分为 ● 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。 ● 唯一索引:索引列中的值必须是唯一的,但是允许为空值 ● 主键索引:是一种特殊的唯一索引,不允许有空值 ● 全文索引: 只有在MyISAM引擎、InnoDB(5.6以后)上才能使⽤用,而且只能在CHAR,VARCHAR,TEXT类型字段上使⽤用全⽂文索引。
MySQL实现文档全文搜索,分词匹配多段落重排展示,知识库搜索原理分享
本文介绍了在文档管理系统中实现高效全文搜索的方案。为解决原有ES搜索引擎私有化部署复杂、运维成本高的问题,我们转而使用MySQL实现搜索功能。通过对用户输入预处理、数据库模糊匹配、结果分段与关键字标红等步骤,实现了精准且高效的搜索效果。目前方案适用于中小企业,未来将根据需求优化并可能重新引入专业搜索引擎以提升性能。
MySQL底层概述—10.InnoDB锁机制
本文介绍了:锁概述、锁分类、全局锁实战、表级锁(偏读)实战、行级锁升级表级锁实战、间隙锁实战、临键锁实战、幻读演示和解决、行级锁(偏写)优化建议、乐观锁实战、行锁原理分析、死锁与解决方案
120 24
MySQL底层概述—10.InnoDB锁机制
MySQL底层概述—8.JOIN排序索引优化
本文主要介绍了MySQL中几种关键的优化技术和概念,包括Join算法原理、IN和EXISTS函数的使用场景、索引排序与额外排序(Using filesort)的区别及优化方法、以及单表和多表查询的索引优化策略。
111 22
MySQL底层概述—8.JOIN排序索引优化
InnoDB与MyISAM实现索引方式的区别?
首先两者都是用的是B+树索引,但二者的实现方式不同。 对于主键索引,InnoDB中叶子节点保存了完整的数据记录,而MyISAM中索引文件与数据文件是分离的,叶子节点上的索引文件仅保存了数据记录的地址. 对于辅助索引,InnoDB中辅助索引会对主键进行存储,查找时,先通过辅助索引的B+树在叶子节点获取对应的主键,然后使用主键在主索引B+树上检索操作,最终得到行数据;MyISAM中要求主索引是唯一的,而辅助索引可以是重复的,主索引与辅助索引没有任何区别,因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址
MySQL索引有哪些类型?
● 普通索引:最基本的索引,没有任何限制。 ● 唯一索引:索引列的值必须唯一,但可以有空值。可以创建组合索引,则列值的组合必须唯一。 ● 主键索引:是特殊的唯一索引,不可以有空值,且表中只存在一个该值。 ● 组合索引:多列值组成一个索引,用于组合搜索,效率高于索引合并。 ● 全文索引:对文本的内容进行分词,进行搜索。
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
111 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
MySQL底层概述—6.索引原理
本文详细回顾了:索引原理、二叉查找树、平衡二叉树(AVL树)、红黑树、B-Tree、B+Tree、Hash索引、聚簇索引与非聚簇索引。
103 11
MySQL底层概述—6.索引原理
MySQL底层概述—5.InnoDB参数优化
本文介绍了MySQL数据库中与内存、日志和IO线程相关的参数优化,旨在提升数据库性能。主要内容包括: 1. 内存相关参数优化:缓冲池内存大小配置、配置多个Buffer Pool实例、Chunk大小配置、InnoDB缓存性能评估、Page管理相关参数、Change Buffer相关参数优化。 2. 日志相关参数优化:日志缓冲区配置、日志文件参数优化。 3. IO线程相关参数优化: 查询缓存参数、脏页刷盘参数、LRU链表参数、脏页刷盘相关参数。
MySQL底层概述—5.InnoDB参数优化
MySQL底层概述—2.InnoDB磁盘结构
InnoDB磁盘结构主要包括表空间(Tablespaces)、数据字典(Data Dictionary)、双写缓冲区(Double Write Buffer)、重做日志(redo log)和撤销日志(undo log)。其中,表空间分为系统、独立、通用、Undo及临时表空间,分别用于存储不同类型的数据。数据字典从MySQL 8.0起不再依赖.frm文件,转而使用InnoDB引擎存储,支持事务原子性DDL操作。
246 100
MySQL底层概述—2.InnoDB磁盘结构