Mysql 什么是聚集索引和非聚集索引?





1. 聚集索引

聚集索引就是基于主键创建的索引,在InnoDB的引擎里,一张表的数据对应的物理文件本身就是按照B+Tree来组织的,聚集索引就是按照每张表的增加来构建的这样一个B+树。叶子节点会存储这个表里的每一行数据记录。 聚集索引并不是仅仅是一种索引类型,还代表的一种数据存储方式。并且表必须有一个主键,如果没有主键InnoDB会默认选择一个隐藏列,作为主键索引来存储表的数据,一般情况是建议自增id作为主键。有连续性的在磁盘下入性能和检索性能上都会很高。如果使用uuid这种随机id的话,频繁插入会导致磁盘随机io,从而性能下降。并且一个表只能存在一个聚集索引,如果有多个就会有多套副本,浪费磁盘空间,并且当操作的时候会让数据维护更困难。

1.1 为什么建议使用连续id?

有连续性的在磁盘写入性能和检索性能上都会很高。如果使用uuid这种随机id的话,频繁插入会导致磁盘随机io,从而性能下降。

1.2 为什么一个表只有一个聚集索引?

如果有多个就会有多套副本,浪费磁盘空间,并且当操作的时候会让数据维护更困难。

2. 非聚集索引

除了主键索引以外的索引都叫做非聚集索引,也叫做二级索引。非聚集索引子节点存放的不是实际数据,而是指向实际数据的指针,一个表中可以拥有多个非聚集索引。

如有错误欢迎指正

经验分享 程序员 微信小程序 职场和发展