目录

​​​​​​​1、聚簇索引和非聚簇索引概念

2、聚簇索引和非聚簇索引的关系

3、聚簇索引和非聚簇索引的索引结构

3.1 非局促索引

3.2局促索引

 3.3  INNODB和MYISAM的主键索引与二级索引的对比:


1、聚簇索引和非聚簇索引概念

聚簇索引:将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据

 

非聚簇索引:将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置

2、聚簇索引和非聚簇索引的关系

聚簇索引是物理有序的;非聚簇索引是逻辑有序,物理无序,在mysql中数据存储顺序就是聚簇索引的顺序,所以一个表只有一个聚簇索引,其他索引都是非聚簇的

如下图所示,一张表 聚簇索引和非聚簇索引的关系

 非聚簇索引的叶子结点存储的是索引列的值,它的数据域是聚簇索引即ID,聚簇索引叶子结点存储的是对应的数据。聚簇索引默认是主键,如果表中没有定义主键,InnoDB 会选择一个唯一且非空的索引代替。如果没有这样的索引,InnoDB 会隐式定义一个主键(类似oracle中的RowId)来作为聚簇索引。如果已经设置了主键为聚簇索引又希望再单独设置聚簇索引,必须先删除主键,然后添加我们想要的聚簇索引,最后恢复设置主键即可。

3、聚簇索引和非聚簇索引的索引结构

下面看一下聚簇索引(以Innodb为例)和非聚簇索引(以MyISAM-->三个文件是分开的为例)两种引擎的索引结构。

如原始数据为:

3.1 非局促索引

MyISAM引擎的数据存储方式如图:

 

 MYISAM是按列值与行号来组织索引的。它的叶子节点中保存的实际上是指向存放数据的物理块的指针。
从MYISAM存储的物理文件我们能看出,MYISAM引擎的索引文件(.MYI)和数据文件(.MYD)是相互独立的。

3.2局促索引

而InnoDB按聚簇索引的形式存储数据,所以它的数据布局有着很大的不同。它存储数据的结构大致如下:
 

注:聚簇索引中的每个叶子节点包含主键值、事务ID、回滚指针(rollback pointer用于事务和MVCC)和余下的列(如col2)。

INNODB的二级索引与主键索引有很大的不同。InnoDB的二级索引的叶子包含主键值,而不是行指针(row pointers),这减小了移动数据或者数据页面分裂时维护二级索引的开销,因为InnoDB不需要更新索引的行指针。其结构大致如下:

 3.3  INNODB和MYISAM的主键索引与二级索引的对比:

 

InnoDB的的二级索引的叶子节点存放的是KEY字段加主键值。因此,通过二级索引查询首先查到是主键值,然后InnoDB再根据查到的主键值通过主键索引找到相应的数据块。而MyISAM的二级索引叶子节点存放的还是列值与行号的组合,叶子节点中保存的是数据的物理地址。所以可以看出MYISAM的主键索引和二级索引没有任何区别,主键索引仅仅只是一个叫做PRIMARY的唯一、非空的索引,且MYISAM引擎中可以不设主键。

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐