聚簇索引:索引文件和数据文件是在一起的
使用举例:使用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 字段,数据并不是根据这些字段排序的
所以,无法走索引
注:联合索引一般都是非主键字段在一起联合建立的索引。
所以,联合索引也属于非聚簇索引,叶子结点存放的都是每一条数据的索引值和对应的主键值