MySQL 中的聚簇索引和非聚簇索引有什么区别?
1. 从不同存储引擎去考虑
- 在MySIAM存储引擎中,索引和数据是分开存储的,包括主键索引在内的所有索引都是“非聚簇”的,每个索引的叶子节点存储的是数据记录的物理地址(指针),而不是数据本身
- 而在InnoDB存储引擎中,InnoDB 的主键索引是聚簇索引,叶子节点直接包含完整数据记录
2. 从InnoDB内部去考虑
- 聚簇索引
- 索引叶子结点存储的是数据行,可以直接访问完整数据
- 每个表只能有一个聚簇索引,通常是主键索引,适合范围查询和排序
- 非聚簇索引
- 索引的叶子结点存储的是主键和对应的索引列,而不是完整数据,如需访问完整数据需要根据主键回表查询
- 一个表可以有多个非聚簇索引,适用于快速查找对应的列数据
注意,主键索引和聚簇索引的区别,他们并不相等!
- 主键优先:
-
- 如果表定义了PRIMARY KEY,则自动使用主键作为聚簇索引
- 无主键时的选择:
-
- 如果没有主键,InnoDB会选择第一个所有列都是NOT NULL的UNIQUE索引作为聚簇索引
- 如果既没有主键也没有符合条件的UNIQUE索引,InnoDB会内部生成一个隐藏的6字节列(
DB_ROW_ID
)作为聚簇索引