聚簇索引:聚簇索引之所以叫聚簇索引,是因为它将数据存储与索引放到了一块。聚簇索引采用 B+ 树的数据结构,它的非叶子节点存储索引键值 和 指向子节点的指针,叶子节点存储 完整的数据行。一个表只能有一个聚簇索引,聚集索引选取规则如下:
-
如果表定义了主键(PRIMARY KEY),则主键自动成为聚簇索引。
-
如果没有主键,InnoDB会选择第一个唯一的非空索引(UNIQUE NOT NULL)作为聚簇索引。
-
如果既无主键也无唯一索引,InnoDB会隐式生成一个隐藏的
ROW_ID
列作为聚簇索引。
在查找效率上,通过聚簇索引查询时,可以直接定位到数据行,无需回表。
非聚簇索引(又叫二级索引):非聚簇索引之所以叫非聚簇索引,是因为它将数据与索引分开存储。非聚簇索引也是采用 B+ 树的数据结构,它的非叶子节点存储索引键值 和 指向子节点的指针,叶子节点存储 索引键值 和 主键值。一个表可以有多个非聚簇索引。通过非聚簇索引查询时,需要先找到主键,再通过聚簇索引回表查询完整数据(称为回表查询)。以下是回表查询的例子:
非聚簇索引如何避免回表:如果查询的字段全部包含在索引中(如联合索引),可避免回表,直接通过索引返回结果。