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

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

在这里插入图片描述

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


在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。辅助索引叶子节点存储的不再是行的物理位置,而是主键值。通过辅助索引首先找到的是主键值,再通过主键值找到数据行的数据页,再通过数据页中的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排序规则排序的,也就是升序排序的。

用于分组

B+树的形成过程

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

  • 每当为某个表创建一个 B+ 树索引(聚簇索引不是人为创建的,默认就有)的时候,都会为这个索引创建一个根节点页面。最开始表中没有数据的时候,每个 B+ 树索引对应的 根节点 中既没有用户记录,也没有目录项记录。

  • 随后向表中插入用户记录时,先把用户记录存储到这个根节点 中。

  • 根节点 中的可用空间用完时继续插入记录,此时会将 根节点 中的所有记录复制到一个新分配的页,比如 页a 中,然后对这个新页进行 页分裂 的操作,得到另一个新页,比如 页b 。这时新插入的记录根据键值(也就是聚簇索引中的主键值,二级索引中对应的索引列的值)的大小就会被分配到 页a 或者 页b 中,而 根节点 便升级为存储目录项记录的页。

索引注意事项

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

  • 只为用于搜索、排序或分组的列创建索引

  • 为列的基数大的列创建索引

  • 索引列的类型尽量小

最后

这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档

祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!

感谢大家的支持!!

image.png

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
厂,拿到满意的薪资和职级~~~加油!!

感谢大家的支持!!

[外链图片转存中…(img-S1OXOpES-1714519497822)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值