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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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


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


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











相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
105 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
5天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的表空间
InnoDB是MySQL默认的存储引擎,主要由存储结构、内存结构和线程结构组成。其存储结构分为逻辑和物理两部分,逻辑存储结构包括表空间、段、区和页。表空间是InnoDB逻辑结构的最高层,所有数据都存放在其中。默认情况下,InnoDB有一个共享表空间ibdata1,用于存放撤销信息、系统事务信息等。启用参数`innodb_file_per_table`后,每张表的数据可以单独存放在一个表空间内,但撤销信息等仍存放在共享表空间中。
|
5天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的段、区和页
MySQL的InnoDB存储引擎逻辑存储结构与Oracle相似,包括表空间、段、区和页。表空间由段和页组成,段包括数据段、索引段等。区是1MB的连续空间,页是16KB的最小物理存储单位。InnoDB是面向行的存储引擎,每个页最多可存放7992行记录。
|
5天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL的InnoDB存储引擎
InnoDB是MySQL的默认存储引擎,广泛应用于互联网公司。它支持事务、行级锁、外键和高效处理大量数据。InnoDB的主要特性包括解决不可重复读和幻读问题、高并发度、B+树索引等。其存储结构分为逻辑和物理两部分,内存结构类似Oracle的SGA和PGA,线程结构包括主线程、I/O线程和其他辅助线程。
【赵渝强老师】MySQL的InnoDB存储引擎
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
1月前
|
存储 缓存 关系型数据库
详细解析MySQL中的innodb和myisam
总之,InnoDB和MyISAM各有千秋,选择合适的存储引擎应基于对应用程序特性的深入理解,以及对性能、数据完整性和可扩展性的综合考量。随着技术发展,InnoDB因其全面的功能和日益优化的性能,逐渐成为更广泛场景下的首选。然而,在特定条件下,MyISAM依然保留其独特的价值。
108 0
|
3月前
|
监控 关系型数据库 MySQL
在Linux中,mysql的innodb如何定位锁问题?
在Linux中,mysql的innodb如何定位锁问题?
|
3月前
|
SQL 存储 关系型数据库
"MySQL增列必锁表?揭秘InnoDB在线DDL,让你的数据库操作飞一般,性能无忧!"
【8月更文挑战第11天】在数据库领域,MySQL凭借其稳定高效的表现深受开发者喜爱。对于是否会在给数据表添加列时锁表的问题,MySQL的行为受版本、存储引擎等因素影响。从5.6版起,InnoDB支持在线DDL,可在改动表结构时保持表的可访问性,避免长时间锁表。而MyISAM等则需锁表完成操作。例如,在使用InnoDB的表上运行`ALTER TABLE users ADD COLUMN email VARCHAR(255);`时,通常不会完全锁表。虽然在线DDL提高了灵活性,但复杂操作或大表变更仍可能暂时影响性能。因此,进行结构变更前应评估其影响并择机执行。
70 6
|
5月前
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.3-InnoDB中的锁
【MySQL技术内幕】6.3-InnoDB中的锁
198 57
|
4月前
|
存储 SQL 关系型数据库
(十三)MySQL引擎篇:半道出家的InnoDB为何能替换官方的MyISAM?
MySQL是一款支持拔插式引擎的数据库,在开发过程中你可以根据业务特性,从支持的诸多引擎中选择一款适合的,例如MyISAM、InnoDB、Merge、Memory(HEAP)、BDB(BerkeleyDB)、Example、Federated、Archive、CSV、Blackhole.....