开启掘金成长之旅!这是我参与「掘金日新计划 · 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。
以如图为例,当前是一个五阶的B-Tree,已经插入了三个数据
当我再插入一个数据1200时,会将中间节点向上分裂。(如果没有中间节点,则取中间偏小的那个值,例如 四阶的树0023 0234 0345 0899会把0234向上分裂)
1.2 B+Tree
B+Tree是在B-Tree的基础上做了一些修改:
- 叶子节点上添加了一个单向链表
- 并且在“向上分裂”的过程中并不会把需要分裂的节点放上去,而是复制一个上去
- 非叶子节点没有数据
在Mysql中,又对B+Tree进行了修改,提高了检索效率
- 如果是二级索引,Key是指当前索引列的值,Key下面挂着的是主键id。
- 如果当前是聚簇索引,则Key下面挂着的是当前行的地址
- 把单向链表换成了双向链表
1.3 Hash索引
Hash索引结构不做讲述,只记某些特点。
- Hash只能用于做对等比较(= ,in),不支持范围查询
- 无法使用索引完成排序操作
- 查询效率高,所以会用在Memery存储引擎,效率往往高于B+Tree
1.4 Innodb选择B+Tree的原因
- 相对于二叉树,层级更少,搜索效率高
- 相对于B-Tree,无论是叶子节点还是非叶子节点,都会保存数据,这样会导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低
- 相对于Hash索引,B+Tree支持范围匹配和排序操作
2. 索引的分类
可以分为以下四种索引
又可以分为以下两种
- 如果存在主键,则主键就是聚集索引(聚集索引就是聚簇索引)
- 如果不存在主键,则选取第一个唯一约束的索引作为聚集索引
- 如果都不存在,则Innodb会自动创建rowid作为这张表的隐藏聚集索引
聚集索引:value挂的是行数据的地址
非聚集索引,也叫做二级索引,value挂的是这个对应的id(或者聚集索引的索引项),找到id后会进行回表查询聚集索引从而得到数据内容