MySQL索引底层

一、聚簇索引和非聚簇索引是什么?他们在索引树的叶子节点上存储数据有什么区别?

聚簇索引:并不是一种单独的索引类型,而是一种存储数据方式,聚簇的意思就是数据行和相邻的键值紧凑的存储在一起,因为无法同时把数据行放在两个不同的地方,所以一个表只能有一个聚簇索引。
聚簇索引的优点:数据访问的更快,因为聚簇索引将索引和数据保存在同一个索引树中,因此从聚簇索引中获取数据通常比在非聚簇索引中查找更快。
InnoDB中的聚簇索引:InnoDB默认对主键建立聚簇索引,如果你不指定主键,InnoDB会用一个具有唯一且非空值的索引来代替。如果不存在这样的索引,InnoDB会定义一个隐藏的主键,然后对其建立聚簇索引。一般来说,InnoDB会以聚簇索引的形式来存储实际的数据,它是其他二级索引的基础。
非聚簇索引:就是普通索引,它的索引树树的叶子节点存储的数据是主键列。因为对于非聚簇索引查询来说,他是无法通过一次扫描树然后就可以定位行记录。
举例:

有表 table(id,name,sex,flag);
id为主键(聚簇索引),name是普通索引。
idnamesexflag
1shenjianmA
3zhangsanmA
5lisimA
9wangwufB

两种索引在索引树中的数据存储如下图:
在这里插入图片描述

1.id为聚簇索引,叶子节点存储行记录;
2.name为普通索引,叶子节点存储主键值,即id;
既然普通索引无法直接定位行记录,那么普通索引的查询过程是什么?

通常情况下要扫描两次索引树
select * from where name = 'lisi';

在这里插入图片描述
图中的扫描过程为:
1.先通过普通索引定位到主键的ID = 5;
2.再通过聚簇索引定位到行记录;
这就是所谓的回表查询,先定位到行记录,然后扫描聚簇索引的索引树。它的性能较扫描一遍索引树效率更低。

二、覆盖索引

覆盖索引:一个索引中包含所有需要查询字段的值。
即Explain的输出结果Extra字段为Using index时,能触发索引覆盖。
如何实现索引覆盖:将被查询的字段,建立到联合索引里去。
使用覆盖索引的好处:无需回表,少了一个索引树的扫描。

三、索引失效的底层原理

只讨论最左前缀法则失效问题。
联合索引排序的原理
先对第一个字段进行排序,在第一个字段相同的情况下对第二个字段排序,以此类推。
大多数情况下两个字段的值怎么会相同?所以很容易引发索引失效问题。

在这里插入图片描述
a的值是有顺序的:1 , 1, 2,2,3,3
b的值是没有顺序的:1,2,1,4,1,2
范围查找右边的索引会失效

explain select * from test where a > 1 and b = 1;

我们可以找到a>1的所有节点,但是此时b索引是无序的,二分查找没办法继续下去了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值