什么是聚簇索引和非聚簇索引?


一、什么是聚簇索引和非聚簇索引?

聚簇索引(Clustered Index):即主键索引,叶子节点存放了数据节点
非聚簇索引(Non-clustered Index):即除了主键的其他索引(也叫做二级索引),叶子节点存放了索引节点

二、聚簇索引和非聚簇索引的区别

  • 数量:聚簇索引只能有一个,而非聚簇索引可以有多个
  • 存储:聚簇索引存储在物理上连续存在,而非聚簇索引在物理上并不连续,只是逻辑上的连续
  • 数据:聚簇索引的叶子节点存的是实际数据,而聚簇索引的叶子节点存的是索引(指向聚簇索引的数据)

三、常见问题

1、查询一条数据记录的流程是怎样的?

通过主键索引查询

  • 直接通过主键ID在聚簇索引上查找对应的叶子节点

通过非主键索引查询

  • 先通过非聚簇索引查找到对应的主键ID
  • 再通过主键ID在聚簇索引上查找对应的叶子节点

2、如果没有创建主键怎么办?

背景:InnoDB中的聚簇索引是按照每张表的主键创建一个B+树,那么如果没有创建主键怎么办?

其实,聚簇索引的key不单单是通过主键来创建的,它是有一个选择顺序:

  1. 判断如果有PRIMARY KEY(id),则作为key,如果没有则判断步骤2
  2. 再判断如果有UNIQUE KEY,则作为key(取第一个),如果没有则判断步骤3
  3. 使用隐藏列DB_ROW_ID作为key(会构造一个GEN_CLUST_INDEX的索引)

文章作者: GaryLee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 GaryLee !
  目录