- 聚簇索引:数据和索引放在一起(B+树下innodb主键索引一般即为聚簇索引存储形式,如果没有主键,或者索引,数据库会隐式创建一个聚簇树) 数据一般存放在叶子结点,并以双向链表的形式进行链接
- 非聚簇索引: 数据和索引没有在一个树中,叶子结点存储的为聚簇(主键)值,一般为一般索引的存储形式,通过一般索引查询数据需要二次查询,第一次在非聚簇索引中查询到符合条件的主键值,第二次再到聚簇索引中查询对应主键值下的行数据进行返回
通过网上两张图片更形象的了解下InnoDB中聚簇索引和非聚簇索引的存储形式:
左边即为聚簇索引,数据和索引存放在一起,
右边为一般索引,数据和索引没有存放在一起,通过一般索引查询需要两次查询。
再贴一张MyISAM的非聚簇存储图:
MyISAM的存储和InnoDB的存储不同点
- 在于MyISAM中索引树中的叶节点存储的是数据存储的地址,并且相邻的数据存储地址也有可能不是相邻的,在获取一页数据时需要多次I/O操作才能完成,而InnoDB中的聚簇索引存储形式是以PAGE即页的形式一块一块存储的,这样在获取数据时一次会加载一页的数据在内存中缓存起来,后面查询同页的其他数据不需要再进行一次I/O操作
- 为什么InnoDB下一般索引采取非聚簇索引形式呢?查询数据还需要两次,效率也慢于聚簇索引,不如将数据也放在一般索引树中(或者将一般索引也改为聚簇索引)
- 在主键索引即聚簇索引在发生数据页分裂时,这样的存储方式我们只需要维护一个主键索引就好,而如果其他一般索引也改为聚簇索引,维护的成本也就变高了
- 在存储大小上,当然非聚簇索引存储的大小 小于 聚簇索引大小
参考博文:
https://my.oschina.net/xiaoyoung/blog/3046779
https://www.jianshu.com/p/fa8192853184