mysql:索引

1.什么是索引

索引(index)是帮助Mysql高效获取数据的数据结构(有序),在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

2.索引的底层数据结构

Mysql默认的底层数据结构是B+树,首先我们先看看二叉树和B树:

二叉搜索树:二叉搜索树可能会退化为链表,时间复杂度从ologn退化到o(n);

image-20240311162836336

如果采用平衡的二叉树,如红黑树:这种情况下如果数据库表的数据量过大,可能会造成树的深度过深,查找效率也不会很高;

B树:B树是一种多叉路平衡查找树,B树每个节点可以有多个分支,即多叉;以一颗最大度数(max-degree)为5(5阶)的B-tree为例,那么B树 的每个节点最多存储4个key:

image-20240311163503857

相较于二叉树,B-tree是一颗矮胖的树,查找效率高。

B+tree:

B+tree是在B-tree基础上的一种优化,使其跟适合实现外存储索引结构,InnoDB存储引擎就是使用B+tree实现索引结构。

image-20240311163950518

B树和B+树对比:1、磁盘读写代价B+树更低;2、查找效率B+树更加稳定;3、B+树便于扫库和区间查找

3.聚簇索引和非聚簇索引

  1. 聚簇索引又称聚集索引,是将数据存储和索引放到一块,索引结构的叶子结点保存了行数据;主键一定是聚簇索引,有且必须有一个聚簇索引。
  2. 非聚簇索引又称二级索引,是将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键;

聚集索引的选取规则:

  • 如果存在主键,则主键是聚集索引
  • 不存在主键,则使用第一个唯一(UNIQUE)索引作为聚集索引
  • 如果表中没有主键,也没有唯一值,则Innodb会自动生成一个rowId作为隐藏的聚集索引

4.回表查询

先通过二级索引找到主键值,再去聚集所以中根据主键值查找数据:

image-20240311165738452

5.覆盖索引

简单来说,覆盖索引是指查询使用了索引,并且需要返回的列,在该索引中全部能够找到。或者说不需要回表查询的就是覆盖索引。

image-20240311170351058

6.索引创建原则

  1. 数据量比较大,且查询比较频繁的表
  2. 常常作为查询条件,排序,分组的字段
  3. 字段内容区分度高
  4. 内容较长,使用前缀索引
  5. 尽量使用联合索引
  6. 要控制索引的数量
  7. 如果索引列不能存储null值,请在创建表时使用Not Null约束它

7.索引失效情况

  1. 违反了最左前缀法则:如果索引了多列,要遵守最左前缀法则,值得是查询从索引的最左前列开始,并且不跳过索引中的列。匹配最左前缀法则,则走索引。

  2. 范围查询右边的列,不能使用索引。

    image-20240311172052522

  3. 不要在索引列上进行运算操作,会导致索引失效。

  4. 字符串不加单引号,造成索引失效,因为不加引号,会发生类型的自动转换,造成索引失效。

  5. 以%开头的Like模糊查询,有可能会造成索引失效。如果是尾部模糊查询,则不会造成索引失效。