【深入浅出MySQL】「底层原理」InnoDB索引原理全程实操指南,带你从入门到精通

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【深入浅出MySQL】「底层原理」InnoDB索引原理全程实操指南,带你从入门到精通

每日一句

不要停顿,因为别人会超过你;不要返顾,以免摔倒。 ——阿·雷哈尼

前言概述

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

正文介绍

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

索引的介绍

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

sql

复制代码

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. 如果没有主键,就会用一个唯一索引且非空字段进行作为主键,也就是聚集索引
  2. 如果也没有上述的字段及索引的话,就会用上述描述的隐藏字段: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

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

sql

复制代码

select * from table where pid = "11";

那么执行过程:

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

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

sql

复制代码

create index table_index on table(name);

此时结构图如下所示:

  • 可以看到存在了两个B+树的索引,采用了table的name建立了一个新的B+树非聚集索引,因此如果我们每增加一个索引,就会增加表的体积,占用磁盘存储空间
  • 但是请注意非聚集索引的叶子节点存储的不是完整的数据行,而只是存在了聚集索引的值(主键->属于聚集索引的值)+ 索引字段的数据值。

sql

复制代码

select * from table where name = "list1";

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

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

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

sql

复制代码

select name from table where name = "list1";

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

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

sql

复制代码

create index table_index on table(birthday);

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

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

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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
2月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
2月前
|
存储 关系型数据库 MySQL
MySQL数据库索引的数据结构?
MySQL中默认使用B+tree索引,它是一种多路平衡搜索树,具有树高较低、检索速度快的特点。所有数据存储在叶子节点,非叶子节点仅作索引,且叶子节点形成双向链表,便于区间查询。
85 4
|
2月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
|
2月前
|
SQL 关系型数据库 MySQL
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
|
3月前
|
存储 关系型数据库 MySQL
MySQL覆盖索引解释
总之,覆盖索引就像是图书馆中那些使得搜索变得极为迅速和简单的工具,一旦正确使用,就会让你的数据库查询飞快而轻便。让数据检索就像是读者在图书目录中以最快速度找到所需信息一样简便。这样的效率和速度,让覆盖索引成为数据库优化师傅们手中的尚方宝剑,既能够提升性能,又能够保持系统的整洁高效。
96 9
|
4月前
|
机器学习/深度学习 关系型数据库 MySQL
对比MySQL全文索引与常规索引的互异性
现在,你或许明白了这两种索引的差异,但任何技术决策都不应仅仅基于理论之上。你可以创建你的数据库实验环境,尝试不同类型的索引,看看它们如何影响性能,感受它们真实的力量。只有这样,你才能熟悉它们,掌握什么时候使用全文索引,什么时候使用常规索引,以适应复杂多变的业务需求。
99 12
|
3月前
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
556 1
|
4月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
3月前
|
SQL 关系型数据库 MySQL
Go语言数据库编程:使用 `database/sql` 与 MySQL/PostgreSQL
Go语言通过`database/sql`标准库提供统一数据库操作接口,支持MySQL、PostgreSQL等多种数据库。本文介绍了驱动安装、连接数据库、基本增删改查操作、预处理语句、事务处理及错误管理等内容,涵盖实际开发中常用的技巧与注意事项,适合快速掌握Go语言数据库编程基础。
201 62
|
2月前
|
SQL 存储 关系型数据库
MySQL功能模块探秘:数据库世界的奇妙之旅
]带你轻松愉快地探索MySQL 8.4.5的核心功能模块,从SQL引擎到存储引擎,从复制机制到插件系统,让你在欢声笑语中掌握数据库的精髓!

推荐镜像

更多