MySQL 聚簇索引学习

聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。InnoDB 的聚簇索引实际上在同一个结构中保存了 B-Tree 索引和数据行。当表有聚簇索引时,它的数据行实际存放在索引的叶子页中,“聚簇”表示数据行和相邻的键值紧凑地存放在一起。一个表只能有一个聚簇索引。


聚簇索引的数据分布

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

  • 可以将相关数据保存在一起
  • 数据访问更快
  • 使用覆盖索引扫描的查询可以直接使用页节点中的主键值
    缺点:
  • 最大提高了 I/O 密集型应用的性能,但是如果数据全部放在内存中,那么访问顺序页没那么重要了
  • 插入速度严重依赖于插入顺序
  • 更新聚簇索引列的代价很高
  • 可能导致全表扫描变慢
  • 二级索引(非聚簇索引)可能很大,因为二级索引的叶子节点包含了引用行的主键列。二级索引访问需要两次索引查找,不是一次。
    二级查找,存储引擎需要找到二级索引的叶子节点获得对应的主键值,然后根据这个值去聚簇索引中查找到对应的行。

InnoDB 和 MyISAM 的数据分布对比

比如下面这个表:

create table layout_test(
    col1 int not null,
    col2 int not null.
    primary key(col1),
    key(col2)
);
MyISAM 中数据存储

col2 的索引分布

InnoDB 支持聚簇索引,所以它是这样的:


InnoDB 中的分布

InnoDB 的二级索引

大对比


聚簇和非聚簇

InnoDB 应该尽可能地按主键顺序插入数据,并且尽可能使用单调增加的聚簇键的值来插入新行。

你可能感兴趣的:(MySQL 聚簇索引学习)