聚集索引与非聚集索引

一、什么是聚集索引(Clustered Index)

聚集索引是一种 数据存储方式,它将 索引和数据放在同一个 B+ 树结构中

  • 一个表最多只能有一个聚集索引。
  • 聚集索引的叶子节点就是数据行本身。
  • 表的数据是按照聚集索引的顺序进行物理存储的。

二、什么是非聚集索引(Secondary Index / Non-Clustered Index)

非聚集索引是指 索引结构与数据分离,索引的叶子节点存储的是指向真实数据的“指针”或“主键值”。

  • 一个表可以有多个非聚集索引。
  • 查询非聚集索引字段时,需要通过主键回表查询实际数据(称为“回表”)。

三、对比总结

特性 聚集索引 非聚集索引
结构 索引和数据在同一棵 B+ 树中 索引与数据分离,叶子节点存储主键值
数据访问 直接从索引中获取数据,无需回表 需要根据主键回表获取数据
数量限制 每个表只能有一个 一个表可以有多个
适用场景 范围查询、高频排序、高频主键查询 精确查询、非主键字段索引查询

InnoDB 与 MyISAM 索引类型对比

引擎 聚集索引 非聚集索引
InnoDB 默认使用聚集索引(主键) 支持非聚集索引
MyISAM 不支持聚集索引 所有索引都是非聚集索引

InnoDB 特点

  • 使用主键作为聚集索引(没有主键则选择第一个唯一非空索引,否则隐式生成 rowid)。
  • 二级索引的叶子节点存储的是主键值(回表查询依赖聚集索引)。
  • 事务支持强,支持行级锁。

MyISAM 特点

  • 所有索引的叶子节点都指向数据文件的物理地址。
  • 不支持聚集索引,也不支持事务和行级锁。

面试总结

在面试中可以这样说:

在 InnoDB 中,主键是聚集索引,数据存储在聚集索引的叶子节点中;而二级索引是非聚集索引,存储的是主键值,所以查询非主键字段时需要“回表”。而 MyISAM 不支持聚集索引,所有索引都是非聚集索引,叶子节点直接存储数据地址。InnoDB 适合高并发事务场景,MyISAM 更适合读多写少的查询场景。

联合索引(组合索引)与最左前缀原则

一、联合索引(组合索引)

联合索引是指对多个字段建立的一个索引,本质是一个多列的 B+ 树索引。例如:

CREATE INDEX idx_name_age ON user(name, age);

二、最左前缀原则(Leftmost Prefix Rule)

最左前缀原则指:在使用联合索引时,查询条件必须包含联合索引中最左边的一列或连续前缀列,索引才会生效

例如,有一个联合索引:

CREATE INDEX idx_a_b_c ON table(a, b, c);

下列查询中,索引的使用情况如下:

  • WHERE a = 1
    ✅ 命中索引,符合最左前缀。

  • WHERE a = 1 AND b = 2
    ✅ 命中索引,连续使用了前缀列。

  • WHERE a = 1 AND c = 3
    ✅ 仅 a 使用索引,c 无法利用索引。

  • WHERE b = 2
    ❌ 不命中索引,跳过了最左列 a

  • WHERE a > 10 AND b = 3
    a 为范围查询,b 无法再使用索引。


总结

联合索引按顺序建立,查询时必须遵循“最左前缀”原则。
只有从最左边开始连续使用字段,索引才能被正确利用。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容