- 当向表中插入新数据或者更新某个数据行时,如果该操作导致对聚簇索引中的某个数据页进行分裂,那么与该数据页相关的所有非聚集索引页也需要进行相应的调整,这可能会导致大量的IO操作和性能损失。
- InnoDB中,非聚簇索引只存储了主键值,并不包含完整的数据记录,因此不会受到数据行移动或者插入新数据时出现的页分裂问题的影响。相比于聚簇索引,占用的空间要少。
- 非聚簇索引的叶子结点内部只会存储数据行(数据文件)的指针,而不储存数据行,可以理解为数据和索引是分开的
- 非聚簇索引叶子节点中存储主键值,每次查找数据时,根据索引找到叶子节点中的主键值,根据主键值再到聚簇索引中得到完整的一行记录(回表查询),可以避免在行移动或者插入新数据时出现的页分裂问题。
- 聚簇索引在一张表只能有一个,而非聚簇索引在一张表里可以有多个
- 当我们需要为表建立多个索引时,如果都是聚簇索引,那将占用大量内存空间,所以 InnoDB 中主键索引所建立的是聚簇索引,而唯一索引、普通索引、前缀索引等其他索引都是非聚簇索引。