一、什么是聚簇索引和非聚簇索引?
聚簇索引(Clustered Index):即主键索引,叶子节点存放了数据节点
非聚簇索引(Non-clustered Index):即除了主键的其他索引(也叫做二级索引),叶子节点存放了索引节点
二、聚簇索引和非聚簇索引的区别
- 数量:聚簇索引只能有一个,而非聚簇索引可以有多个
- 存储:聚簇索引存储在物理上连续存在,而非聚簇索引在物理上并不连续,只是逻辑上的连续
- 数据:聚簇索引的叶子节点存的是实际数据,而聚簇索引的叶子节点存的是索引(指向聚簇索引的数据)
三、常见问题
1、查询一条数据记录的流程是怎样的?
通过主键索引查询:
- 直接通过主键ID在聚簇索引上查找对应的叶子节点
通过非主键索引查询:
- 先通过非聚簇索引查找到对应的主键ID
- 再通过主键ID在聚簇索引上查找对应的叶子节点
2、如果没有创建主键怎么办?
背景:InnoDB中的聚簇索引是按照每张表的主键创建一个B+树,那么如果没有创建主键怎么办?
其实,聚簇索引的key不单单是通过主键来创建的,它是有一个选择顺序:
- 判断如果有
PRIMARY KEY(id)
,则作为key,如果没有则判断步骤2 - 再判断如果有
UNIQUE KEY
,则作为key(取第一个),如果没有则判断步骤3 - 使用隐藏列
DB_ROW_ID
作为key(会构造一个GEN_CLUST_INDEX
的索引)