MySQL 复习笔记(一)------ 索引 [1/3]

278 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天

1. 索引的结构

Mysql中的索引有两种,分别是B+Tree和Hash。

其中B+Tree是Innodb存储引擎的索引类型,Hash是Memery存储引擎的索引类型

1.1 B-Tree

B+Tree是基于B-Tree而做的,所以先讲解B-Tree。

B-Tree:多路平衡查找树

以如下四阶的B-Tree为例,n阶就表明其最多可以存储n个Key和n+1个指针,指针指向下一个节点。Key下面挂着的是这个Key对应的value。

image.png

以如图为例,当前是一个五阶的B-Tree,已经插入了三个数据

image.png

当我再插入一个数据1200时,会将中间节点向上分裂。(如果没有中间节点,则取中间偏小的那个值,例如 四阶的树0023 0234 0345 0899会把0234向上分裂)

image.png

1.2 B+Tree

B+Tree是在B-Tree的基础上做了一些修改:

  1. 叶子节点上添加了一个单向链表
  2. 并且在“向上分裂”的过程中并不会把需要分裂的节点放上去,而是复制一个上去
  3. 非叶子节点没有数据

image.png

在Mysql中,又对B+Tree进行了修改,提高了检索效率

  1. 如果是二级索引,Key是指当前索引列的值,Key下面挂着的是主键id。
  2. 如果当前是聚簇索引,则Key下面挂着的是当前行的地址
  3. 把单向链表换成了双向链表

image.png

1.3 Hash索引

Hash索引结构不做讲述,只记某些特点。

  1. Hash只能用于做对等比较(= ,in),不支持范围查询
  2. 无法使用索引完成排序操作
  3. 查询效率高,所以会用在Memery存储引擎,效率往往高于B+Tree

1.4 Innodb选择B+Tree的原因

  1. 相对于二叉树,层级更少,搜索效率高
  2. 相对于B-Tree,无论是叶子节点还是非叶子节点,都会保存数据,这样会导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低
  3. 相对于Hash索引,B+Tree支持范围匹配和排序操作

2. 索引的分类

可以分为以下四种索引

image.png

又可以分为以下两种

image.png

  1. 如果存在主键,则主键就是聚集索引(聚集索引就是聚簇索引)
  2. 如果不存在主键,则选取第一个唯一约束的索引作为聚集索引
  3. 如果都不存在,则Innodb会自动创建rowid作为这张表的隐藏聚集索引

聚集索引:value挂的是行数据的地址

image.png

非聚集索引,也叫做二级索引,value挂的是这个对应的id(或者聚集索引的索引项),找到id后会进行回表查询聚集索引从而得到数据内容

image.png