Mysql的索引是数据库优化当中一个非常核心的概念,同时索引的底层也是java面试当中常见的考点之一,因此今天小编就来和大家分享与索引相关的知识点
1.索引的概念m
索引是数据库中一种特殊的数据结构,用于快速定位数据,减少全表扫描的次数,提高查询效率,带入我们的平常生活之中,索引就相当于一本字典的目录,假设我们没有目录就需要逐一翻页查找,而拥有了目录,我们就可以快速定位到所需要的数据,这在效率上提升了不少。
2.索引的结构
索引的结构往往是通过一些能够快进行快速查询的数据结构来实现,比如哈希表,二叉排序树,平衡二叉树,红黑树,b树,b+树等等,不过在如此之多的数据看结构当中Mysql依旧选择了我们的b+树,接下来我就来对这些数据结构逐一做优缺点的分析。
Hash表
优点:通过key值来进行键值秒杀查找数据,时间复杂度是O(1)
缺点: 完全无序无法进行排序,也不能进行范围查询
二叉排序树
优点:由于左节点大于根,右节点小于根,因此二叉数的中序排序是有序的,能排序,也可以做范围查询,时间复杂度O(log n);
缺点: 但在数据插入时会退化成链表,导致查找的性能下降。
平衡二叉树
优点:每次插入数据后都会做旋转,严格平衡(左右子树高度差≤1),可以有效防止在极端情况 下,时间复杂度是O(log n)。
缺点:但是平衡二茶树追求绝对的平衡,因此无论在删除还是插入的操作,都会导致平衡二叉树 去频繁的左旋右旋来保证二叉树的平衡,这会带来大量的磁盘io也是十分消耗cpu的性能的。
红黑树
优点:红黑树本身也是二叉平衡树的一种,通过变色旋转来保持平衡,但红黑树不追求绝对的平 衡所以会大大降低磁盘io,进而提高性能,时间复杂度是O(log n)。
缺点:但红黑树本身依旧只是二叉树,二叉树的孩子只能有两个,这也就意味着当红黑树存储 大量数据的时候,就会导致树高升高过快,而二叉树的查找性能是和树高直接相关的,也就是 说,在存储数据达到一个限度时,红黑树的性能其实是相对较差的。
B树(多路平衡排序树)
优点:节点既存数据,又存索引,且有n个孩子节点,可以降低树高的问题,显著的提升效率。
缺点:但范围查询需要中序回溯,磁盘随机 IO 多,依旧具有一定的效率问题。
B+树
优点:非叶子节点存储索引,而叶子节点用来存储数据,而这样非叶子节点可存储的数据就会更 多,同时树高就能降低,同时由于数据是存储在双向链表当中的,因此数据查询只需要遍历双 向链表就可以获取到,而不用回溯整个数据。
3.索引的分类
索引的分类主要包含了聚簇索引和非聚簇索引以及覆盖索引,聚簇索引和非聚簇索引的区别就是聚簇索引的节点存储了索引包括其对应的数据,而非聚簇索引是将索引值和数据分开存储,而覆盖索引是一个逻辑概念指的是任意索引满足"查询列被索引全部包含"。
在了解这些之后我们需要知道sql查询中的一个常见问题,那就是回表查询的问题,例如在查询某个数据时无法直接查到数据,而是要通过查询id后再通过id的索引树,再查询到数据,而这个十分耗时的过程就是回表。
因此大多的sql优化都是为了避免回表查询,我们需要多构建多个字段组成的联合索引去达成覆盖索引的效果,来达到避免回表的效果。
4.最左前缀匹配法则
核心就是对联合索引 (a,b,c),MySQL 只能按"从左往右的连续片段"去用索引,跳过左边的列,后面就失效。
联合索引底层就是一棵 B+Tree,先按 a 排序,a 相同再按 b 排序,b 相同再按 c 排序。
-
若查询条件没有 a,整个树是"乱序"的,无法走索引。
-
若缺少中间列,则右侧子树失去有序性,只能把左侧部分当"索引截断"使用。
5.索引失效问题
即使创建了索引,以下情况也可能导致索引失效,变成全表扫描:

6.什么情况下需要添加索引
-
频繁作为查询条件的列(
WHERE
,JOIN
,ORDER BY
,GROUP BY
)。 -
数据量较大(万级以上)。
-
列的重复值较少(高选择性)。
7.怎么优化和定位索引
可以打开mysql的慢查询日志,并设置规定的判断为慢SQL的时间,进而用explain函数解析SQL语句,最后根据结果做优化。
今天的分享就到这里了,希望这篇博客能给你一些帮助,让你对关于 sql索引的问题得到进一步的提升,在面试的时候能从容面对面试官。