0
点赞
收藏
分享

微信扫一扫

MySQL索引(三)——常见索引概念

Python芸芸 2022-03-13 阅读 50

聚簇索引:索引文件和数据文件是在一起的

使用举例:使用Innodb存储引擎建立的主键索引:

示意图:

如下图所示,我们的数据其实都是放在索引的叶子结点中。数据和索引是再一起存放的。

非聚簇索引:索引文件和数据文件是分开的

使用举例:

Innodb的非主键索引,MyISAM的索引(主键和非主键索引都是非聚簇索引)

示意图:

(1):Innodb的非主键索引:

注:非主键索引和主键索引的结构是相同的,唯一的区别在于叶子结点。

        主键索引叶子结点存放的是 一条条的数据记录,而 非主键索引的叶子结点存放的是

        每一条数据的索引值和对应的主键值

问:为什么非主键索引叶子结点不存放真实的数据,而只是存放索引值和主键值?

答:如果每一个非主键索引的叶子节点都存放真实的数据,那么我们将来可能建立很多的非主键索引,那么 每一个非主键索引都有一份数据,相当于我们把一份数据复制了很多份,将会浪费磁盘空间

回表操作:

场景:

一个person表存放着  id,name,age,height,weight数据,我们对这个表已经建立了主键 id 索引, 和非主键 name 索引,现在有一条SQL语句是: select  *  from  person  where  name  =  ' Jack '

执行流程:

我们可以走 name 索引找到相应的数据记录,但是我们根据 name 索引找到的数据记录只存放了

name 索引字段和主键 id 字段,但是查询的确实 *,所以我们必须根据找到的主键 id,再去主键索引 找到全部的数据记录,这就叫回表

(2):MyISAM的索引:对于MYISAM来讲,索引文件和数据文件是分开的

联合索引:

之前讲的索引都是基于主键的单索引,而现在是基于多个非主键字段的索引

                               

联合索引的规则:

        我们根据 name, age ,postion 三个字段建立索引

        首先根据  name字段进行排序建立索引,如果name 字段相同,再根据 age字段排序,

        如果 age 也相同,再根据postion字段排序

示意图:

最左前缀法则:

select  *  from  表名   where  name =  'Jim'  and  age   =  15;

select  *  from  表名   where  age  =  20  and  positive  ='dev';

select  *  from  表名   where  positive  =  'dev';

上述三个SQL语句,只有第一个SQL语句走索引,因为建立索引的规则是先按照name来排序的

age也是排好序的,但是有个前提是,在name相同的时候,age才是排好序的

如果我们单纯的查询 age,或者 positive 字段,数据并不是根据这些字段排序的

所以,无法走索引

注:联合索引一般都是非主键字段在一起联合建立的索引。

        所以,联合索引也属于非聚簇索引,叶子结点存放的都是每一条数据的索引值和对应的主键值

举报

相关推荐

0 条评论