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

简介: 【深入浅出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 
相关文章
|
12月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
存储 网络协议 关系型数据库
MySQL8.4创建keyring给InnoDB表进行静态数据加密
MySQL8.4创建keyring给InnoDB表进行静态数据加密
533 1
|
自然语言处理 搜索推荐 关系型数据库
MySQL实现文档全文搜索,分词匹配多段落重排展示,知识库搜索原理分享
本文介绍了在文档管理系统中实现高效全文搜索的方案。为解决原有ES搜索引擎私有化部署复杂、运维成本高的问题,我们转而使用MySQL实现搜索功能。通过对用户输入预处理、数据库模糊匹配、结果分段与关键字标红等步骤,实现了精准且高效的搜索效果。目前方案适用于中小企业,未来将根据需求优化并可能重新引入专业搜索引擎以提升性能。
718 5
|
10月前
|
存储 关系型数据库 MySQL
介绍MySQL的InnoDB引擎特性
总结而言 , Inno DB 引搞 是 MySQL 中 高 性 能 , 高 可靠 的 存 储选项 , 宽泛 应用于要求强 复杂交易处理场景 。
400 15
|
12月前
|
SQL 关系型数据库 MySQL
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
|
关系型数据库 MySQL 数据库
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
959 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
|
存储 算法 关系型数据库
InnoDB与MyISAM实现索引方式的区别?
首先两者都是用的是B+树索引,但二者的实现方式不同。 对于主键索引,InnoDB中叶子节点保存了完整的数据记录,而MyISAM中索引文件与数据文件是分离的,叶子节点上的索引文件仅保存了数据记录的地址. 对于辅助索引,InnoDB中辅助索引会对主键进行存储,查找时,先通过辅助索引的B+树在叶子节点获取对应的主键,然后使用主键在主索引B+树上检索操作,最终得到行数据;MyISAM中要求主索引是唯一的,而辅助索引可以是重复的,主索引与辅助索引没有任何区别,因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址
|
SQL 缓存 关系型数据库
使用温InnoDB缓冲池启动MySQL测试
使用温InnoDB缓冲池启动MySQL测试
271 0
|
存储 缓存 关系型数据库
MySQL进阶突击系列(08)年少不知BufferPool核心原理 | 大哥送来三条大金链子LRU、Flush、Free
本文深入探讨了MySQL中InnoDB存储引擎的buffer pool机制,包括其内存管理、数据页加载与淘汰策略。Buffer pool作为高并发读写的缓存池,默认大小为128MB,通过free链表、flush链表和LRU链表管理数据页的存取与淘汰。其中,改进型LRU链表采用冷热分离设计,确保预读机制不会影响缓存公平性。文章还介绍了缓存数据页的刷盘机制及参数配置,帮助读者理解buffer pool的运行原理,优化MySQL性能。
|
10月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
588 158

推荐镜像

更多