说到笼罩索引之前,先要领会它的数据结构:B+树。
先建个表演示(为了简朴,id按顺序建):
id
name
1
aa
3
kl
5
op
8
aa
10
kk
11
kl
14
jk
16
ml
17
mn
18
kl
19
kl
22
hj
24
io
25
vg
29
jk
31
jk
33
rt
34
ty
35
yu
37
rt
39
rt
41
ty
45
qt
47
ty
53
qi
57
gh
61
dh
以主键以外的列值作为键值构建的 B+ 树索引,我们称之为非群集索引。
非群集索引与群集索引的区别在于非群集索引的叶子节点不存储表中的数据,而是存储该列对应的主键,想要查找数据我们还需要凭据主键再去群集索引中举行查找,这个再凭据群集索引查找数据的历程,我们称为回表。
B+树
B+树和B树是mysql索引的常用数据结构,B+树是B树的进一步优化,将上面的表转成图剖析一下:
B+树的特点:
1.B+树非叶子节点上是不存储数据的,仅存储键值
2.叶子节点的数据是根据顺序排列的
3.B+ 树中各个页之间是通过双向链表毗邻
聚簇索引和非聚簇索引
B+ 树索引根据存储方式的差别分为群集索引和非群集索引。
聚簇索引:
以 InnoDB 作为存储引擎的表,表中的数据都市有一个主键,纵然你不建立主键,系统也会帮你建立一个隐式的主键。
这是由于 InnoDB 是把数据存放在 B+ 树中的,而 B+树的键值就是主键,在 B+树的叶子节点中,存储了表中所有的数据。
这种以主键作为 B+ 树索引的键值而构建的 B+树索引,我们称之为群集索引。
非聚簇索引:
以主键以外的列值作为键值构建的 B+ 树索引,我们称之为非群集索引。
非群集索引与群集索引的区别在于非群集索引的叶子节点不存储表中的数据,而是存储该列对应的主键,想要查找数据我们还需要凭据主键再去群集索引中举行查找,这个再凭据群集索引查找数据的历程,我们称为回表。
如何用笼罩索引制止回表
为什么明显用了非主键索引还会回表,简朴说就是非主键索引是非聚簇索引,在B+树叶子节点中只保留主键和该非主键索引,一次查询只能查到这两个字段,若是想查三个字段,就必须再查一次聚簇索引,这就是回表。
举个例子,表中新增一个字段age,我们用name建一个索引(非聚簇索引)
id
name
age
10
zs
23
7
ls
54
13
ww
12
5
zl
76
8
xw
23
12
xm
43
17
dy
21
select id,name from user where name = 'zs';
能够掷中name索引,索引叶子节点存储了主键id,通过name的索引树即可获取id和name,无需回表,相符索引笼罩,效率较高。
select id,name,age from user where name = 'zs';
能够掷中name索引,索引叶子节点存储了主键id,但age字段必须回表查询才气获取到,不相符索引笼罩,需要再次通过id值扫码群集索引获取age字段,效率会降低。
结论:那怎么做才气制止回表呢?很简朴,将单列索引(name)升级为团结索引(name,age).