聚簇索引
特点:
- 索引和数据保存在同一个B+树中,
- 每一页 也就是每一个节点是按照主键的大小顺序排成一个单项链表,
- B+树的每一层的页与页之间也是根据主键大小顺序排成一个双向链表,
- 非叶子节点存储的是记录的主键+指向的页号,
- 叶子节点存储的是完整的用户记录。
优点:
- 数据的访问快,因为数据就在这个B+树中,比非聚集索引少了回表的操作
- 聚簇索引对主键的排序查找和范围查找速度很快。因为B+树是按照主键的大小建立的,而且叶子节点是双向链表找左右的数据非常快。
- 比非聚集索引节省了大量的IO操作
缺点:
- 插入速度严重依赖于插入的顺序,按照主键的顺序插入是最快的方式,否则将出现页分裂,严重影响性能。因此对于InnoDB,我们一般都会定义一个自增的ID列作为主键
- 更新的代价高......
限制:
- 只有InnoDB引擎支持聚簇索引,MyISAM不支持聚簇索引
- 由于物理排序方式只能有一种,所以每个MySQL的表只能由一个聚簇索引
- 如果没有为表定义主键,InnoDB会选择非空的唯一索引列代替。如果没有这样的列,InnoDB会自己定义一个 隐式主键 作为聚簇索引
- 为了充分利用聚簇索引的特性,InnoDB中表应该选择有序的id,不建议使用无序的id,比如UUID、字符串作为索引,这样就无法保证数据的顺序增长。
非聚簇索引:(二级索引、辅助索引)
聚簇索引,只能在所搜条件是主键值是才能发挥作用,因为B+树中的数据都是按照主键进行排序的,如果我们想以别的列作为搜索条件,那么就需要创建非聚簇索引。
例如,以c2列作为搜索条件,那么需要使用c2列创建一棵B+树,如下所示:
这个B+树与聚簇索引的不同点:
- 页内的记录是按照从c2列的大小顺序排成的一个单项链表。
- 页和页直接按也是根据页中记录的c2列的大小顺序排成的一个双向链表
- 非叶子节点存储的是记录的c2列+指向下一层页号
- 叶子节点存储的并不是完整的用户记录,而只是c2列+主键这两个列的值
一个表中可以有多个非聚簇索引,但是聚簇索引只能有一个。