MySQL 主键索引和聚簇索引的区别

1. 主键索引和聚簇索引的区别

MySQL 聚簇索引的叶子节点就是数据节点,主键索引就是聚簇索引吗?答案是否定的。

在 MySQL 数据库 innodb 引擎里面,主键索引确实就是聚簇索引。但是 myisam 引擎里面主键索引并不是聚簇索引。

2. 聚簇索引生成规则

对于 Innodb,主键毫无疑问是一个聚簇索引。但是当一个表没有主键,或者没有一个索引,Innodb 会如何处理呢?

  • 1. 如果一个主键被定义了,那么这个主键就是作为聚簇索引。
  • 2. 如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚簇索引。
  • 3. 如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚簇索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增。
  • 4.自增主键会把数据自动向后插入,避免了插入过程中的聚簇索引排序问题。

聚簇索引的排序,必然会带来大范围的数据的物理移动,这里面带来的磁盘 IO 性能损耗是非常大的。 而如果聚簇索引上的值可以改动的话,那么也会触发物理磁盘上的移动,于是就可能出现 page 分裂,表碎片横生。所以不应该修改聚簇索引。

什么是回表查询和索引覆盖?如何实现索引覆盖?哪些场景,可以利用索引覆盖来优化SQL?测试数据库表结构:create table user ( id int primary key, name varcha ...