29人参与 • 2025-08-18 • Mysql
在 mysql 的 innodb 引擎中,聚簇索引(clustered index)和非聚簇索引(non - clustered index,也叫二级索引、辅助索引 )是索引体系的核心,二者在存储结构、查询逻辑、适用场景等方面差异显著,以下从底层原理到实际影响详细拆解:
定义:
存储结构:
id
+ name
+ age
+ … )。row_id
作为聚簇索引 )。定义:
存储结构:
name
) + 主键值(如 id
)。name
、age
分别建索引 )。假设表 user
结构:id
(主键,聚簇索引 )、name
(二级索引 )、age
等字段。
若查询条件是 where id = 1
(主键,走聚簇索引 ):
id = 1
的叶子节点。id=1
+ name=alice
+ age=20
+ … ),直接返回结果,无需额外操作。若查询条件是 where name = 'alice'
(name
是二级索引 ):
name
二级索引的根节点开始,二分查找定位到 name = 'alice'
的叶子节点。id = 1
)。id = 1
到聚簇索引中查找,定位到聚簇索引的叶子节点,获取完整数据行(id=1
+ name=alice
+ age=20
+ … )。对比维度 | 聚簇索引 | 非聚簇索引 |
---|---|---|
存储内容 | 叶子节点存完整数据行(主键 + 所有字段) | 叶子节点存索引键值 + 主键值 |
数量限制 | 一张表仅 1 个(主键/隐式 row_id ) | 一张表可多个(按需创建二级索引) |
查询是否回表 | 直接返回数据,无需回表 | 需用主键回查聚簇索引,必然回表(除非覆盖索引 ) |
索引与数据的关系 | 索引结构与数据物理存储完全融合 | 索引结构与数据物理存储分离,需关联主键 |
插入/更新影响 | 数据插入需调整聚簇索引结构,可能引发页分裂 | 插入/更新仅调整二级索引,影响相对小 |
查询性能 | 主键查询极快,但二级索引查询需回表 | 二级索引查询需额外回表,性能略低(覆盖索引除外 ) |
where id = ?
)直接命中数据,无需回表,效率极高。主键选择:
bigint auto_increment
),减少聚簇索引插入时的页分裂,提升写入性能。二级索引设计:
name
和 name, age
同时建索引 ),增加维护成本。name
和 age
,建 (name, age)
联合索引 ),减少回表。聚簇索引是 “索引即数据,数据即索引” 的深度融合,最大化主键查询效率,但插入需谨慎;非聚簇索引是 “索引指向数据” 的分离结构,支持灵活查询,但依赖回表(或覆盖索引 )优化性能。
innodb 中,二者协同构成索引体系,理解差异是设计高性能表结构的基础。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论