MySQL学习-聚簇索引

31 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

前言

上篇我们学习了MySQL中的InnoDB的索引。有兴趣的小伙伴可以阅读(MySQL学习-InnoDB中的索引(五))。
下面我们继续学习MySQL中的InnoDB的索引之聚簇索引。

索引按照物理实现方式,可以分为2种:聚簇索引和非聚簇索引。也把非聚簇索引称为二级索引或者辅助索引。

聚簇索引

特点

  • 使用记录主键值的大小进行记录和页的排序,这包括三个方面的含义:
    • 业内的记录是按照主键大小顺序排成一个单向链表。
    • 各个存放数据记录的页也是根据页中记录的主键大小顺序排成一个双向链表。
    • 存放目录项记录的页分为不同的层次,在同一层次中的页也是根据页中目录项记录的主键大小顺序排成一个双向链表。
  • B+树的叶子节点存储的是完整的数据记录。

所谓完整的数据记录,就是指这个记录中存储了所有列的值,包含隐藏值。

优点

  • 数据访问快,因为聚簇索引将所有和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快。
  • 聚簇索引对于主键的排序查找和范围查找速度非常快。
  • 按照聚簇索引排列顺序,查询显示一定范围数据的时候,由于数据都是紧密相连,数据库不用从多个数据块中提取数据,所以节省了大量的io操作。

缺点

  • 插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键。
  • 更新主键的代价很高,因为这会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。
  • 二级索引访问需要两次索引查找,第一次查到主键值,第二次根据主键值找到行数据。

今天先学到这里,明天继续。