聚簇索引
定义:针对主键构成的,且具备如下四种特性的索引,就称为聚簇索引。
本质:并不是一种单独的索引类型,而只是一种数据存储方式。由于所有的用户记录都存储在叶子节点,也称为 索引即数据,数据即索引。(如InnoDB存储引擎格式下的数据表的.ibd文件中,就是索引和数据存 储在一起)
特性:
① 页内 的记录是按照主键的大小顺序排成一个 单向链表 。
? ② 各个存放 用户记录的页与页之间也是根据页中用户记录的主键大小顺序排成一个 双向链表 。
? ③ 存放 目录项记录的页 分为不同的层次,在同一层次中的页也是根据页中目录项记录的主键 大小顺序排成一个 双向链表 。
? ④ 叶子节点中存储的是完整的用户记录
优点:
① 数据访问更快 ,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快
② 聚簇索引对于主键的 排序查找 和 范围查找 速度非常快
③ 按照聚簇索引排列顺序,查询显示一定范围数据的时候,由于数据都是紧密相连,数据库不用从多 个数据块中提取数据,所以 节省了大量的io操作 。
缺点:
① 插入速度严重依赖于插入顺序 ,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影 响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键
② 更新主键的代价很高 ,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为 不可更新
限制:
① 在MySQL数据库中,只有InnoDB存储引擎支持聚簇索引
?② 数据的物理存储排序方式只能有一种,所以每个数据表只能有一个聚簇索引
?③ 如果没有定义主键,InnoDB会自动选择非空的唯一索引代替
?④ 为了充分发挥聚簇索引的特性,故数据表的主键尽量选用有序的id
注意:
聚簇索引无需我们在MySQL语句中显示的使用INDEX语句去创建,InnoDB存储引擎会自动的为我们创建聚簇索引
非聚簇索引
定义:非主键构成的索引,称为非聚簇索引,别称二级索引、辅助索引
作用:解决以非主键字段作为搜索条件的查找问题,避免了需要遍历记录的费时操作
特性:
① 非聚簇索引的叶子节点中,列上只有该非主键字段和主键字段两个值,
② 一个数据表只有一个聚簇索引,但可以有多个非聚簇索引
回表:
根据搜索条件选择对应的非聚簇索引进行查询,然后得到对应的记录主键,再根据主键值使用聚簇索引进行一次查询,从而最终获取到完整的记录,这个过程叫做回表。
注意:
非聚簇索引中,叶子节点上不存储完整的记录,就是为了避免数据大量冗余。