以上问题经常面试被问到:看起来很简单但是也很刁钻 ,
主键和聚簇索引之间的关系:
在mysql数据库innodb引擎里面,主键的确就是聚簇索引。
在myisam引擎里面主键也不是聚集索引。
聚簇索引决定了数据库的物理存储结构,而主键只是确定表格逻辑组织方式。这两者不可混淆!聚
聚簇索引索引不唯一,当主键存在时 一般是有主键充当聚簇索引,
当主键不存在时 一般是由第一个唯一非空索引(非空值)充当聚簇索引,
如果既没有主键也没有唯一非空索引 那么在Innodb 会生成一个 隐藏是主键作为索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增
自增主键会把数据自动向后插入,避免了插入过程中的聚集索引排序问题。聚集索引的排序,必然会带来大范围的数据的物理移动,这里面带来的磁盘IO性能损耗是非常大的。 而如果聚集索引上的值可以改动的话,那么也会触发物理磁盘上的移动,于是就可能出现page分裂,表碎片横生。所以不应该修改聚集索引。
总结:也就是在Innodb 中存在主键一定是聚集索引 不存在就不是 会自己产生一个隐藏索引(我们叫做 隐藏主键)。
在MyISam中因为是非聚集索引存储(只存在指向主键的指针),主键查询是分开的,不存在主键和索引对应关系,(此过程也是回表)
聚簇索引和二级索引:
聚簇索引:
常叫主键索引,比如nnodb,聚簇索引的叶子节点对应的就是实际的一行数据,由于数据在物理上是一份,所以聚簇索引只能有一个。聚簇索引的索引键就是数据表的主键,如果没有主键会选择一个没有null值的唯一列。
二级索引:
就是常说的普通索引、非聚簇索引,它是与聚簇索引配合使用的,它的B+树的叶子节点存放的是对应数据的主键。查找的时候先获取数据的主键,再根据主键获取实际的数据(这个过程就是回表)。