聚簇索引 VS 主键索引
作者:互联网
聚簇索引并不是一种单独的索引类型,而是一种数据存储方式,具体细节依赖于其实现方式。
MySQL数据库中innodb存储引擎,B+树索引可以分为:
- 聚簇索引(也称聚集索引,clustered index)
- 辅助索引(有时也称非聚簇索引或二级索引,secondary index,non-clustered index)。
这两种索引内部都是B+树,聚集索引的叶子节点存放着一整行的数据。
Innobd中的主键索引是一种聚簇索引,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引。
InnoDB中,表数据文件本身就是按B+树组织的一个索引结构,聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分;一般建表会用一个自增主键做聚簇索引,没有的话MySQL会默认创建,但是这个主键如果更改代价较高,故建表时要考虑自增ID不能频繁update这点。
我们日常工作中,根据实际情况自行添加的索引都是辅助索引,辅助索引就是一个为了需要找主键索引的二级索引,现在找到主键索引再通过主键索引找数据。
Innodb通过主键聚集数据,如果没有定义主键,innodb会选择【非空】的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。
聚簇索引的优缺点:
- 优点
- 数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快
- 聚簇索引对于主键的排序查找和范围查找速度非常快
- 缺点
- 插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键。
- 更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般【定义主键为不可更新】。
- 二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。
在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。
辅助索引叶子节点存储的不再是行的物理位置,而是主键值。通过辅助索引首先找到的是主键值,再通过主键值找到数据行的数据页,再通过数据页中的Page Directory找到数据行。
Innodb辅助索引的叶子节点并不包含行记录的全部数据,叶子节点除了包含键值外,还包含了相应行数据的聚簇索引键。
辅助索引的存在不影响数据在聚簇索引中的组织,所以一张表可以有多个辅助索引。在innodb中有时也称辅助索引为二级索引。
标签:辅助,聚簇,索引,键值,数据,主键 来源: https://www.cnblogs.com/xfeiyun/p/15898896.html