聚簇索引和非聚簇索引

  • 聚簇索引数据和索引放在一起(B+树下innodb主键索引一般即为聚簇索引存储形式,如果没有主键,或者索引,数据库会隐式创建一个聚簇树) 数据一般存放在叶子结点,并以双向链表的形式进行链接
  • 非聚簇索引: 数据和索引没有在一个树中,叶子结点存储的为聚簇(主键)值,一般为一般索引的存储形式,通过一般索引查询数据需要二次查询,第一次在非聚簇索引中查询到符合条件的主键值,第二次再到聚簇索引中查询对应主键值下的行数据进行返回

通过网上两张图片更形象的了解下InnoDB中聚簇索引和非聚簇索引的存储形式:
在这里插入图片描述
左边即为聚簇索引,数据和索引存放在一起,
右边为一般索引,数据和索引没有存放在一起,通过一般索引查询需要两次查询。

再贴一张MyISAM的非聚簇存储图:
在这里插入图片描述
MyISAM的存储和InnoDB的存储不同点

  1. 在于MyISAM中索引树中的叶节点存储的是数据存储的地址,并且相邻的数据存储地址也有可能不是相邻的,在获取一页数据时需要多次I/O操作才能完成,而InnoDB中的聚簇索引存储形式是以PAGE即页的形式一块一块存储的,这样在获取数据时一次会加载一页的数据在内存中缓存起来,后面查询同页的其他数据不需要再进行一次I/O操作
  • 为什么InnoDB下一般索引采取非聚簇索引形式呢?查询数据还需要两次,效率也慢于聚簇索引,不如将数据也放在一般索引树中(或者将一般索引也改为聚簇索引)
  1. 在主键索引即聚簇索引在发生数据页分裂时,这样的存储方式我们只需要维护一个主键索引就好,而如果其他一般索引也改为聚簇索引,维护的成本也就变高了
  2. 在存储大小上,当然非聚簇索引存储的大小 小于 聚簇索引大小

参考博文:
https://my.oschina.net/xiaoyoung/blog/3046779
https://www.jianshu.com/p/fa8192853184

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值