聚簇索引就是对磁盘上的实际数据重新组织以按照特定的一个或者多个列的值排序的算法

特点是存储数据的顺序和索引顺序一致 一般情况下主键会默认生成聚簇索引 且一张表有且只有一个聚簇索引

聚簇索引和非聚簇索引的区别是:
聚簇索引的叶子节点就是数据节点 而非聚簇索引的叶子节点仍然是索引文件 只是这个索引文件中包含指向对应数据块的指针

MySQL中不同的数据存储引擎对聚簇索引有不同的支持

MyISAM使用的是非聚簇索引

原始数据

mysql 聚合列和非聚合列含义 mysql的聚簇和非聚簇_mysql 聚合列和非聚合列含义

存储方式

mysql 聚合列和非聚合列含义 mysql的聚簇和非聚簇_算法_02

按照列值和行号来组织索引的 叶子节点中保存的实际上是指向存放数据块的指针

从物理文件中也可以看出 MyISAM的索引文件.MYI和数据文件.MYD是分开存储的 是相对独立的

对于InnoDB引擎来说,是按照聚簇索引的形式存储数据

mysql 聚合列和非聚合列含义 mysql的聚簇和非聚簇_索引_03

它的每个聚簇索引的叶子节点都包含主键值、事务ID、回滚指针(用于事务和MVCC)以及余下的列。

从物理文件也可以看出 InnoDB的数据文件只有数据结构文件.frm和数据文件.idb 其中.idb中存放的是数据和索引信息 是存放在一起的

InnoDB的二级索引和主键索引也有很大的不同 二级索引存放的是主键值而不是行指针 减少了移动数据或者分裂时维护二级索引的开销,因为不需要更新索引的行指针

mysql 聚合列和非聚合列含义 mysql的聚簇和非聚簇_mysql_04

MyISAM和InnoDB的二级索引的对比

mysql 聚合列和非聚合列含义 mysql的聚簇和非聚簇_索引_05

从图中可以看出 InnoDB二级索引的叶子节点存放的是KEY字段+主键值,因此首先通过二级索引查找到的是主键值,再根据主键值在朱建索引中查找到相应的数据文件。
而MyISAM的二级索引存放的还是列值和行号的组合 叶子节点中保存的是指向物理数据的指针,因此它的主建索引和二级索引的结构并没有任何区别,只是说主键索引的索引值是唯一且非空的,而MyISAM引擎可以不设置主键。

InnoDB引擎是必须设置主键的,需要依赖主键生成聚簇索引,因此当没有指定主键的时候,InnoDB引擎会默认寻找一个可以唯一标识每行数据的列作为主键,当这种列不存在的时候,会默认生成一个6字节整型的隐藏列作为主键