MySQL中的聚簇索引和非聚簇索引

一、索引的概念

索引相当于一本书的目录,可以加快查找速度。

innodb和myisam存储引擎的索引都使用了b+树这种数据结构。

 

二、聚簇索引和非聚簇索引

1、概述

这里先说明下,聚簇索引又叫聚集索引,非聚簇索引又叫非聚集索引。

【重要:聚簇索引和非聚簇索引并不是索引类型,而是数据的存储方式。】

聚簇,就是数据的最终查找要靠主键索引来定位数据;

非聚簇,就是不靠主键索引也可以定位到数据。

 

2、聚簇索引存储方式中是如何查找到最终数据的

聚簇索引存储方式中,分为主键b+树和辅助键b+树。

主键索引在主键b+树上,其他索引各有一棵辅助键b+树。主键b+树上,叶子节点存储的就是真实数据,辅助键b+树上,叶子节点存储的是主键ID。

用户要查找一条记录,如果where条件是主键,则可以直接到主键b+树上定位到对应的叶子节点,然后直接从叶子节点取出数据。

如果where条件不是主键索引,而是其他索引,则先到辅助键b+树上取到符合条件的主键ID,再拿着这个ID到主键b+树上取到数据。

聚簇索引存储方式的代表引擎是innodb,聚簇索引存储方式必须要有主键,如果在建表时没有指定主键,则MySQL会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键。

 

3、非聚簇索引存储方式中是如何查找到最终数据的

非聚簇索引中,虽然也分为主键b+树和辅助键b+树,但二者的区别并不大,地位几乎相等,没有以谁为中心的概念,代表存储引擎是myisam。

非聚簇索引存储方式中,在主键b+树和辅助键b+树中,叶子节点存储的都是数据的物理地址。

用户查找一条记录,根据where条件到对应索引所在的b+树上查找到符合条件的记录,然后拿到数据的物理地址,进而到磁盘上获取数据。

非聚簇索引存储方式中,数据文件和索引文件是分开的,这点和聚簇索引存储方式有着本质上的不同。