聚簇索引和非聚簇索引

 

  在InnoDB中,表数据文件本身就是按 B+Tree 组织的一个索引结构,聚簇索引就是按照 每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚簇索引的叶子节点称为数据页。这个特性决定了索引组织表中的数据也是索引的一部分。

  一般建表会用一个自增主键做聚簇索引,没有的话 MySQL会默认创建,但是这个主键如果要更改代价比较高,故建表时要考虑自增 ID 不能频繁 UPDATE 这点。

  平时工作中,根据实际情况自行添加的索引都是辅助索引,辅助索引就是一个为了需找主键索引的二级索引,先找到主键索引再通过主键索引找数据。

  聚簇索引并不是单的的索引类型,而是一种数据存储方式。具体依赖于其实现方式。

  MySQL 数据库中 InnoDB 存储引擎,B+ 树索引可以分为聚簇索引(也称聚集索引,clustered index)和辅助索引(有时也称非聚簇索引或二级索引,secondary index,non-clustered index)。这两种索引内部都是 B+树,聚集索引的叶子节点存放着一整行的数据。

  InnoDB 中的主键索引就是一种聚簇索引,非聚簇索引都是引用索引,像复合索引,前缀索引,唯一索引。

  InnoDB 使用的是聚簇索引,MyISAM使用的是非聚簇索引。

 

  聚簇索引(聚集索引)

    聚簇索引就是按照每张表的主键构造一颗 B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分,每张表只能拥有一个聚簇索引。

InnoDB通过主键聚集索引,如果没有定义主键,InnoDB会选择非空的唯一索引替代。如果没有这样的索引,InnoDB会隐式的定义一个主键来作为聚簇索引。

  优点:

    a. 数据访问更快,因为聚簇索引将索引和数据保存在同一个 B+ 树中,因此从聚簇索引中获取数据比非聚簇索引更快。

    b. 聚簇索引对主键的排序和范围查找速度非常快。

  缺点:

    a. 插入速度严重依赖于顺序插入,按照主键的插入顺序是最快的方式,否则会出现页分裂,严重影响性能。因此,对于 InnoDB表,我们一般都会定义一个自增的 ID 列为主键。

    b. 更新主键的代价很高,因为将会导致被更新的行移动。因此,对于 InnoDB表,一般定义主键为不可更新。

    c. 二级索引访问需要两次索引查找,第一次找到主键,第二次根据主键值找到行数据。

 

  辅助索引(非聚簇索引)

    在聚簇索引上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。辅助索引叶子节点存储的不再是行的物理位置,而是主键值。通过辅助索引首先找到主键值,再通过主键值找到数据行的数据页,再通过数据页中的 Page Directory找到数据行。

    InnoDB辅助索引的叶子节点并不包含行记录的全部数据,叶子节点 除了包含键值外,还包含了对应行数据的聚簇索引键。

    辅助索引的存在不影响聚簇索引中的组织,所以一张表可以有多个 辅助索引。在 InnoDB中 有时也称辅助索引为二级索引。