给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引

给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引
最新回答
一袭水袖舞倾城

2022-04-18 14:55:57

MySQL聚簇索引和非聚簇索引

一、聚簇索引(Clustered Index)

定义:聚簇索引是指索引的存储顺序与数据的物理存储顺序一致的索引。在MySQL的InnoDB存储引擎中,聚簇索引就是主键索引,即找到了索引就找到了需要的数据。

特点

  • 数据存储与索引存储一体:聚簇索引的叶子节点存储的是整行的数据,因此,当根据主键进行查询时,可以直接从聚簇索引中获取所需的数据,无需额外的回表操作。
  • 高效的数据访问:由于数据按主键顺序存储,因此在进行范围查询、排序等操作时,可以显著提高查询效率。
  • 主键修改代价高:由于聚簇索引的存储顺序与数据物理存储顺序一致,因此修改主键值会导致数据的物理移动,这是一个相对昂贵的操作。

示例:在创建的学生表中,如果以id作为主键,则id上的索引就是聚簇索引。执行select * from student where id = 1时,可以直接从聚簇索引中获取到id=1的整行数据。

二、非聚簇索引(Non-Clustered Index)

定义:非聚簇索引是指索引的存储顺序与数据的物理存储顺序不一致的索引。在MySQL的InnoDB存储引擎中,非聚簇索引也叫做皮族辅助索引,其叶子节点存储的是主键值,而不是整行的数据。

特点

  • 索引存储与数据存储分离:非聚簇索引的叶子节点存储的是主键值,因此,当根据非聚簇索引进行查询时,需要先找到非聚簇索引的叶子节点,然后根据叶子节点中的主键值回表查询所需的数据。
  • 适用于频繁查询的列:由于非聚簇索引的存储与数据物理存储顺序无关,因此可以针对频繁查询的列建立非聚簇索引,以提高查询效率。
  • 占用额外存储空间:由于非聚簇索引需要存储主键值,并且需要额外的存储空间来维护索引结构,因此会占用更多的存储空间。

示例:在创建的学生表中,如果no是一个唯一索引,则no上的索引就是非聚簇索引。执行select no,name from student where no = 'test'时,需要先找型茄到no索引的叶子节点,然后根据叶子节点中的主键值回表查询no和name的值。但是,如果执行select no from student where no = 'test'时,由于查询的列就是索引本身,此时可以认为在该查询场景下,no索引也可以当做聚簇索引使用(尽管它本质上是非聚簇索引),因为不需要回表查询即可获取所需的数据。

总结

  • 主键一定是卜握察聚簇索引:在MySQL的InnoDB存储引擎中,主键一定是聚簇索引,且每个表只能有一个聚簇索引。
  • 非聚簇索引需要回表查询:非聚簇索引的叶子节点存储的是主键值,因此需要根据主键值回表查询所需的数据。
  • 选择主键要慎重:由于修改聚簇索引的代价较高,因此选择主键时要慎重,尽量选择那些不经常修改的列作为主键。
  • MyISAM引擎没有聚簇索引:需要注意的是,MyISAM存储引擎不支持聚簇索引,其索引结构与非聚簇索引类似,但不存在与数据物理存储顺序一致的问题。