MySQL-索引的分类(聚簇索引、二级索引、联合索引)

在InnoDB中索引分为好几种类型,下面我们一起来看一种常见的索引类型吧。

索引的分类

================================================================

聚簇索引


特点

  1. InnoDB存储引擎会自动的为我们创建聚簇索引。聚簇索引 就是数据的存储方式(所有的用户记录都存储在了 叶子节点 ),也就是所谓的索引即数据,数据即索引

  2. 主键索引是聚簇索引的一种

在这里插入图片描述

二级索引(辅助索引、非聚簇索引)


在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。辅助索引叶子节点存储的不再是行的物理位置,而是主键值。通过辅助索引首先找到的是主键值,再通过主键值找到数据行的数据页,再通过数据页中的Page Directory找到数据行。

需要回表操作。

我们通过这张图来具体的了解一下:

在这里插入图片描述

要点

  • 使用记录 c2 列的大小进行记录和页的排序,这包括三个方面的含义:

  • 页内的记录是按照 c2 列的大小顺序排成一个单向链表。

  • 各个存放用户记录的页也是根据页中记录的 c2 列大小顺序排成一个双向链表。

  • 存放目录项记录的页分为不同的层次,在同一层次中的页也是根据页中目录项记录的 c2 列大小顺序排成一个双向链表。

  • B+ 树的叶子节点存储的并不是完整的用户记录,而只是 c2列+主键 这两个列的值。

  • 目录项记录中不再是 主键+页号 的搭配,而变成了 c2列+页号 的搭配。

过程

以查找 c2 列的值为 4 的记录为例,查找过程如下:

  1. 确定 目录项记录 页
  • 根据 根页面 ,也就是 页44 ,可以快速定位到 目录项记录 所在的页为 页42 (因为 2 < 4 < 9 )。
  1. 通过 目录项记录 页确定用户记录真实所在的页。
  • 在 页42 中可以快速定位到实际存储用户记录的页,但是由于 c2 列并没有唯一性约束,所以 c2 列值为 4 的记录可能分布在多个数据页中,又因为 2 < 4 ≤ 4 ,所以确定实际存储用户记录的页在 页34 和 页35 中。
  1. 在真实存储用户记录的页中定位到具体的记录。
  • 到 页34 和 页35 中定位到具体的记录。
  1. 但是这个 B+ 树的叶子节点中的记录只存储了 c2 和 c1 (也就是 主键 )两个列,所以我们必须再根据主键值去聚簇索引中再查找一遍完整的用户记录。

回表的含义

以 c2 列大小排序的 B+ 树只能确定我们要查找记录的主键值, 所以如果我们想根据 c2 列的值查找到完整的用户记录的话,仍然需要到 聚簇索引 中再查一遍,这个过程也被称为 回表。

联合索引


以同时以多个列的大小作为排序规则,也就是同时为多个列建立索引。

  • 先把各个记录和页按照 c2 列进行排序。

  • 在记录的 c2 列相同的情况下,采用 c3 列进行排序

联合索引的使用(B+树索引的适用情况)

全值匹配

  • WHERE 子句中的几个搜索条件的顺序对查询结果没有影响

最左匹配原则

  • 如果我们想使用联合索引中尽可能多的列,搜索条件中的各个列必须是联合索引中从最左边连续的列

匹配列前缀

  • 为某个列建立索引是在对应的B+树的记录中使用该列的值进行排序。字符串排序的本质是比较字符串的大小。比较字符串大小就用到了该列的字符集和比较规则。

○ 先比较字符串的第一个字符,第一个字符小的那个字符串就比较小。

○ 如果两个字符串的第一个字符相同,那就再比较第二个字符,第二个字符比较小的那个字符串就比较小。

○ 如果两个字符串的第二个字符也相同,那就接着比较第三个字符,依此类推。

匹配范围值

  • 如果对多个列同时进行范围查找的话,只有对索引最左边的那个列进行范围查找的时候才能用到 B+ 树索引

用于排序

  • ORDER BY子句后的列如果不加ASC或者DESC默认是按照ASC排序规则排序的,也就是升序排序的。

用于分组

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值