mysql如何理解聚簇索引和非聚簇索引

P粉602998670
发布: 2025-09-30 13:42:02
原创
947人浏览过
聚簇索引决定数据物理存储顺序,每表仅一个,InnoDB以主键构建,数据存于B+树叶子节点;非聚簇索引叶子节点存主键值,需回表查询完整数据,支持多个,可利用覆盖索引避免回表。

mysql如何理解聚簇索引和非聚簇索引

在MySQL中,聚簇索引和非聚簇索引是两种重要的索引组织方式,主要影响数据的存储结构和查询效率。理解它们的关键在于搞清楚数据行是否和索引结构紧密绑定在一起

聚簇索引(Clustered Index)

聚簇索引决定了表中数据行的物理存储顺序。也就是说,数据行本身存储在B+树的叶子节点上,索引的结构和数据是一体的。

  • InnoDB引擎默认使用主键作为聚簇索引。如果你没有定义主键,InnoDB会自动选择一个唯一非空索引,如果没有这样的索引,还会隐式创建一个6字节的rowid作为聚簇索引。
  • 因为数据行只能按一种方式排序,所以每张表只能有一个聚簇索引
  • 根据主键查询非常快,因为直接定位到数据所在页,不需要额外的查找。
  • 插入数据时会按照主键顺序排列,可能导致页分裂或频繁调整B+树结构,特别是在主键无序插入时。

非聚簇索引(Secondary Index / 非聚簇索引)

非聚簇索引的叶子节点不存储完整的数据行,而是存储对应行的主键值。当你通过非聚簇索引查找数据时,需要先找到主键,再通过主键去聚簇索引中查找完整数据——这个过程叫做回表查询

卡奥斯智能交互引擎
卡奥斯智能交互引擎

聚焦工业领域的AI搜索引擎工具

卡奥斯智能交互引擎 36
查看详情 卡奥斯智能交互引擎
  • 常见的普通索引、唯一索引、联合索引都属于非聚簇索引。
  • 可以有多个非聚簇索引,每个都指向聚簇索引的主键。
  • 查询效率相对聚簇索引略低,因为多了一次索引跳转(回表)。
  • 如果查询只需要用到索引中的字段(覆盖索引),就可以避免回表,提升性能。

举个例子帮助理解

假设有一张用户表:

CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  email VARCHAR(100),
  INDEX idx_name (name)
);
登录后复制
  • id 是聚簇索引:所有数据按id有序存储在B+树的叶子节点。
  • idx_name 是非聚簇索引:它的B+树叶子节点保存的是 (name, id) 的组合。当你执行 SELECT * FROM users WHERE name = 'Alice',先在 idx_name 中找到对应的 id,再用这个 id 去主键索引中查出完整记录。
  • 如果执行的是 SELECT id, name FROM users WHERE name = 'Alice',由于所有需要的字段都在非聚簇索引中,就不需要回表,称为“覆盖索引”优化。

基本上就这些。聚簇索引关乎数据怎么存,非聚簇索引是辅助查找路径。合理设计主键和索引,能显著提升查询性能。

以上就是mysql如何理解聚簇索引和非聚簇索引的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号