在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。辅助索引叶子节点存储的不再是行的物理位置,而是主键值。通过辅助索引首先找到的是主键值,再通过主键值找到数据行的数据页,再通过数据页中的Page Directory找到数据行。
需要回表操作。
我们通过这张图来具体的了解一下:
要点
-
使用记录 c2 列的大小进行记录和页的排序,这包括三个方面的含义:
-
页内的记录是按照 c2 列的大小顺序排成一个单向链表。
-
各个存放用户记录的页也是根据页中记录的 c2 列大小顺序排成一个双向链表。
-
存放目录项记录的页分为不同的层次,在同一层次中的页也是根据页中目录项记录的 c2 列大小顺序排成一个双向链表。
-
B+ 树的叶子节点存储的并不是完整的用户记录,而只是 c2列+主键 这两个列的值。
-
目录项记录中不再是 主键+页号 的搭配,而变成了 c2列+页号 的搭配。
过程
以查找 c2 列的值为 4 的记录为例,查找过程如下:
- 确定 目录项记录 页
- 根据 根页面 ,也就是 页44 ,可以快速定位到 目录项记录 所在的页为 页42 (因为 2 < 4 < 9 )。
- 通过 目录项记录 页确定用户记录真实所在的页。
- 在 页42 中可以快速定位到实际存储用户记录的页,但是由于 c2 列并没有唯一性约束,所以 c2 列值为 4 的记录可能分布在多个数据页中,又因为 2 < 4 ≤ 4 ,所以确定实际存储用户记录的页在 页34 和 页35 中。
- 在真实存储用户记录的页中定位到具体的记录。
- 到 页34 和 页35 中定位到具体的记录。
- 但是这个 B+ 树的叶子节点中的记录只存储了 c2 和 c1 (也就是 主键 )两个列,所以我们必须再根据主键值去聚簇索引中再查找一遍完整的用户记录。
回表的含义
以 c2 列大小排序的 B+ 树只能确定我们要查找记录的主键值, 所以如果我们想根据 c2 列的值查找到完整的用户记录的话,仍然需要到 聚簇索引 中再查一遍,这个过程也被称为 回表。
以同时以多个列的大小作为排序规则,也就是同时为多个列建立索引。
-
先把各个记录和页按照 c2 列进行排序。
-
在记录的 c2 列相同的情况下,采用 c3 列进行排序
联合索引的使用(B+树索引的适用情况)
全值匹配
- WHERE 子句中的几个搜索条件的顺序对查询结果没有影响
最左匹配原则
- 如果我们想使用联合索引中尽可能多的列,搜索条件中的各个列必须是联合索引中从最左边连续的列
匹配列前缀
- 为某个列建立索引是在对应的B+树的记录中使用该列的值进行排序。字符串排序的本质是比较字符串的大小。比较字符串大小就用到了该列的字符集和比较规则。
○ 先比较字符串的第一个字符,第一个字符小的那个字符串就比较小。
○ 如果两个字符串的第一个字符相同,那就再比较第二个字符,第二个字符比较小的那个字符串就比较小。
○ 如果两个字符串的第二个字符也相同,那就接着比较第三个字符,依此类推。
匹配范围值
- 如果对多个列同时进行范围查找的话,只有对索引最左边的那个列进行范围查找的时候才能用到 B+ 树索引
用于排序
- ORDER BY子句后的列如果不加ASC或者DESC默认是按照ASC排序规则排序的,也就是升序排序的。
用于分组
===================================================================
-
每当为某个表创建一个 B+ 树索引(聚簇索引不是人为创建的,默认就有)的时候,都会为这个索引创建一个根节点页面。最开始表中没有数据的时候,每个 B+ 树索引对应的 根节点 中既没有用户记录,也没有目录项记录。
-
随后向表中插入用户记录时,先把用户记录存储到这个根节点 中。
-
当 根节点 中的可用空间用完时继续插入记录,此时会将 根节点 中的所有记录复制到一个新分配的页,比如 页a 中,然后对这个新页进行 页分裂 的操作,得到另一个新页,比如 页b 。这时新插入的记录根据键值(也就是聚簇索引中的主键值,二级索引中对应的索引列的值)的大小就会被分配到 页a 或者 页b 中,而 根节点 便升级为存储目录项记录的页。
=================================================================
-
只为用于搜索、排序或分组的列创建索引
-
为列的基数大的列创建索引
-
索引列的类型尽量小
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
提升的资深开发者,这些资料都将为你打开新的学习之门!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!