为什么聚簇索引只有一个?什么是回表、索引覆盖、左匹配和索引下推?

  • Post author:
  • Post category:其他




1.如何判断是否为聚簇索引?

取决于数据和索引是否放在一起,数据和索引放在一起则为聚簇索引,否则为非聚簇索引



2.为什么聚簇索引只有一个?

我们先假设有这么一张表table和数据

在这里插入图片描述


2.1首先我们先看MYISAM:只能是非聚簇索引(因为数据和索引是分开存放的)


在这里插入图片描述

在这里插入图片描述


myisam上面放的是索引(1),下面存放的是实际数据行地址(0x0022)



2.2INNODB:

主键索引就是聚簇索引

,只能有一个聚簇索引,但是可以有很多非聚簇索引


在这里插入图片描述



当innodb插入数据的时候,必须要包含一个索引的key值,可以是主键,如果没有主键,那么就是唯一键,如果没有唯一键,那么就是自生成的6字节rowid



在这里插入图片描述


innodb上面放的是索引(1),下面是数据(1,teacher.ma)


因为聚簇索引数据跟索引放到一起,如果有多个聚簇索引就会产生数据冗余




3.假设我们再给name字段加个索引,之前的id已经是主键了,那么存储方式就会演变成下面这种了

在这里插入图片描述

为什么呢?因为我们给name建立了

非聚簇索引

,所以name下面就不能存放数据,因为会造成数据冗余,那应该放什么?

在这里插入图片描述


应该放数据所在索引的key的值,所有非聚簇索引都指向聚簇索引,不然找不到数据




4.什么是回表?

还是上面的一张表,我们假设id是主键,name是索引列

select * from table where name = ma


先根据name查询id,再根据id查询整行的记录,走了2颗B+树,此时这种现象叫

回表


回表:当根据普通索引查询到聚簇索引的key值之后,再根据key值聚簇索引中获取所有行记录




5.什么是索引覆盖

select id,name from table where name = ma

根据name可以直接查询id,name两个列的值,直接返回即可,不需要从聚簇索引查询任何数据,此时叫

索引覆盖




6.什么是最左匹配

还是上面那张表,id是主键,name和age是组合索引列,组合索引使用的时候必须先匹配name再匹配age

在这里插入图片描述


最左匹配



在MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配




7.什么是索引下推

mysql分为三层架构

在这里插入图片描述

select * from table where name=?and age=


在没有索引下推之前

:先根据name从存储引擎中获取符合规则的数据,然后再server层对age进行过滤


有索引下推之后

:根据name,age两个的条件来从存储引擎中获取对应的数据


索引下推



原来在server层做的计算,放到存储引擎中计算了,减少了server层和存储引擎层的数据交互



版权声明:本文为weixin_49092628原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。