主键和聚簇索引之间的关系以及聚簇索引和二级索引

以上问题经常面试被问到:看起来很简单但是也很刁钻 ,

主键和聚簇索引之间的关系:

在mysql数据库innodb引擎里面,主键的确就是聚簇索引。

在myisam引擎里面主键也不是聚集索引。

聚簇索引决定了数据库的物理存储结构,而主键只是确定表格逻辑组织方式。这两者不可混淆!

聚簇索引索引不唯一,当主键存在时 一般是有主键充当聚簇索引,

当主键不存在时 一般是由第一个唯一非空索引(非空值)充当聚簇索引,

如果既没有主键也没有唯一非空索引  那么在Innodb 会生成一个 隐藏是主键作为索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增

自增主键会把数据自动向后插入,避免了插入过程中的聚集索引排序问题。聚集索引的排序,必然会带来大范围的数据的物理移动,这里面带来的磁盘IO性能损耗是非常大的。 而如果聚集索引上的值可以改动的话,那么也会触发物理磁盘上的移动,于是就可能出现page分裂,表碎片横生。所以不应该修改聚集索引。

总结:也就是在Innodb 中存在主键一定是聚集索引  不存在就不是 会自己产生一个隐藏索引(我们叫做 隐藏主键)。

在MyISam中因为是非聚集索引存储(只存在指向主键的指针),主键查询是分开的,不存在主键和索引对应关系,(此过程也是回表)
 

聚簇索引和二级索引:

聚簇索引:
常叫主键索引,比如nnodb,聚簇索引的叶子节点对应的就是实际的一行数据,由于数据在物理上是一份,所以聚簇索引只能有一个。聚簇索引的索引键就是数据表的主键,如果没有主键会选择一个没有null值的唯一列。
二级索引:
就是常说的普通索引、非聚簇索引,它是与聚簇索引配合使用的,它的B+树的叶子节点存放的是对应数据的主键。查找的时候先获取数据的主键,再根据主键获取实际的数据(这个过程就是回表)。

为了提高查找速度,二级索引是不是建的越多越好


不是,建立二级索引要考虑建立索引的代价,主要看维护代价、空间代价和回表代价。
维护代价:数据在增加,删除,修改时不仅要修改聚簇索引,还需要维护二级索引,降低效率。(在某些分布式场景,需要维护的就是索引表)
空间代价:占用存储空间,二级索引存储了对应列的值和主键,占用空间
回表代价:查完二级索引还需要回表

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值