MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?

      • 主要解答
      • 详细解答
        • 1. **聚簇索引(Clustered Index)**
        • 2. **非聚簇索引(Non-Clustered Index / Secondary Index)**
        • 3. **对比总结**
        • 4. **流程图(查询过程对比)**
      • 知识拓展与延伸
        • 1. **如何选择主键和索引**
        • 2. **Java 后端开发中的应用**
        • 3. **常见误区**

主要解答

在 MySQL 的 InnoDB 引擎中,聚簇索引非聚簇索引的主要区别在于数据存储方式和查询机制:

  • 聚簇索引:主键索引,数据行与索引存储在一起,数据按主键顺序物理存储。InnoDB 表必须有聚簇索引(通常为主键)。
  • 非聚簇索引:二级索引(Secondary Index),索引和数据分开存储,索引叶子节点存储主键值,查询需通过主键“回表”获取完整数据。

详细解答

1. 聚簇索引(Clustered Index)
  • 特点
    • 数据与索引一体化:聚簇索引的 B+ 树叶子节点存储完整的数据行,数据按主键顺序物理存储。
    • 唯一性:一张 InnoDB 表只能有一个聚簇索引,通常是主键。如果没有定义主键,InnoDB 会选择第一个非空的唯一索引,或生成一个隐藏的 6 字节 ROWID 作为聚簇索引。
    • 存储位置:数据和索引存储在 .ibd 文件中。
  • 实现细节
    • B+ 树结构:聚簇索引的 B+ 树叶子节点包含完整行数据,非叶子节点存储主键值和指针。
    • 插入/更新:插入或更新数据时,需维护 B+ 树的平衡,可能触发页面分裂,影响性能。
    • 查询效率:通过主键查询直接定位数据行,无需额外 I/O。
    • 空间占用:由于数据与索引存储在一起,聚簇索引本身不占用额外索引空间,但数据按主键顺序存储可能导致空间碎片。
  • 适用场景
    • 主键查询(如 WHERE id = 100)。
    • 范围查询(如 WHERE id BETWEEN 100 AND 200)。
    • 排序操作(如 ORDER BY id)。
  • 优缺点
    • 优点
      • 主键查询效率高,无需回表。
      • 范围查询和排序性能优越,因数据按顺序存储。
    • 缺点
      • 插入/更新成本较高,因需维护 B+ 树平衡。
      • 非顺序插入(如随机 UUID 作为主键)可能导致频繁页面分裂。
  • 代码示例
    -- 创建表时指定主键(聚簇索引)
    CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50)
    ) ENGINE = InnoDB;
    -- 主键查询(直接使用聚簇索引)
    SELECT * FROM users WHERE id = 100;
    
2. 非聚簇索引(Non-Clustered Index / Secondary Index)
  • 特点
    • 索引与数据分离:非聚簇索引的 B+ 树叶子节点存储索引列值和主键值(而非完整数据行)。
    • 回表操作:查询时,先通过非聚簇索引找到主键值,再通过聚簇索引获取完整数据(称为“回表”)。
    • 多索引支持:一张表可以有多个非聚簇索引(如普通索引、唯一索引)。
  • 实现细节
    • B+ 树结构:叶子节点存储索引列值和对应的主键值,非叶子节点存储索引列值和指针。
    • 存储位置:索引存储在 .ibd 文件的独立 B+ 树中,占用额外空间。
    • 查询过程
      • 查找非聚簇索引,获取主键值。
      • 通过主键值访问聚簇索引,获取完整数据。
    • 覆盖索引:如果查询字段全在非聚簇索引中(如 SELECT index_column FROM table),可避免回表。
  • 适用场景
    • 非主键字段的查询(如 WHERE name = 'Alice')。
    • 覆盖索引场景(如 SELECT user_id FROM users WHERE user_id = '100')。
    • 多条件查询(如复合索引)。
  • 优缺点
    • 优点
      • 灵活支持多字段查询。
      • 覆盖索引可提高查询效率。
    • 缺点
      • 回表操作增加 I/O 开销。
      • 维护多个非聚簇索引增加插入/更新成本。
  • 代码示例
    -- 创建非聚簇索引
    CREATE INDEX idx_name ON users(name);
    -- 非聚簇索引查询(可能触发回表)
    SELECT * FROM users WHERE name = 'Alice';
    -- 覆盖索引查询(无需回表)
    SELECT name FROM users WHERE name = 'Alice';
    
3. 对比总结
特性聚簇索引(Clustered Index)非聚簇索引(Non-Clustered Index)
存储内容完整数据行索引列值 + 主键值
数量限制每表一个(通常为主键)可多个
查询效率主键查询无需回表,效率高需回表(除覆盖索引外),效率较低
空间占用数据与索引一体,无额外索引空间占用额外索引空间
维护成本插入/更新需调整数据页,成本较高维护多个索引,成本随索引数增加
适用场景主键查询、范围查询、排序非主键查询、覆盖索引、多条件查询
4. 流程图(查询过程对比)

以下是用 Mermaid 流程图语言描述的聚簇索引和非聚簇索引查询过程:

聚簇索引
非聚簇索引
覆盖索引
需回表
开始查询
索引类型
查找主键 B+ 树
直接获取完整数据行
返回结果
查找二级索引 B+ 树
获取主键值
访问聚簇索引
  • 聚簇索引:直接定位数据,步骤少。
  • 非聚簇索引:需先查索引再回表,步骤多,除非使用覆盖索引。

知识拓展与延伸

1. 如何选择主键和索引
  • 主键选择(聚簇索引)
    • 优先选择自增整数(如 INT AUTO_INCREMENT)作为主键,因其顺序插入避免页面分裂,查询效率高。
    • 避免使用随机值(如 UUID)作为主键,因随机插入导致频繁页面分裂,增加维护成本。
    • 示例:
      CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,user_id VARCHAR(50)
      ) ENGINE = InnoDB;
      
  • 非聚簇索引设计
    • 为频繁查询的列(如 WHEREJOINORDER BY 条件)创建索引。
    • 使用复合索引优化多条件查询,注意列顺序(高选择性列放前面)。
      CREATE INDEX idx_user_id_date ON orders(user_id, order_date);
      
    • 设计覆盖索引减少回表:
      CREATE INDEX idx_user_id_name ON users(user_id, name);
      SELECT user_id, name FROM users WHERE user_id = '100'; -- 使用覆盖索引
      
2. Java 后端开发中的应用
  • ORM 框架中的索引管理
    • 在 Spring Data JPA 中,使用 @Index 注解定义非聚簇索引:
      @Entity
      @Table(name = "users", indexes = {@Index(name = "idx_user_id", columnList = "user_id")})
      public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String userId;private String name;
      }
      
    • 通过 Hibernate 的 hbm2ddl 自动生成索引,或手动执行 DDL 语句。
  • 查询优化
    • 使用 JPA 的 @Query 编写高效 SQL,结合索引:
      @Query("SELECT u.userId, u.name FROM User u WHERE u.userId = :userId")
      List<Object[]> findUserByUserId(@Param("userId") String userId);
      
    • 分析慢查询日志,优化未使用索引的查询:
      SET GLOBAL slow_query_log = 1;
      
  • 批量操作
    • 批量插入时,禁用索引更新以提高性能:
      ALTER TABLE users DISABLE KEYS;
      INSERT INTO users (user_id, name) VALUES (...), (...);
      ALTER TABLE users ENABLE KEYS;
      
3. 常见误区
  • 误区 1:认为非聚簇索引总是效率低。覆盖索引可避免回表,性能接近聚簇索引。
  • 误区 2:忽略主键选择对性能的影响。随机主键(如 UUID)导致页面分裂,降低插入性能。
  • 误区 3:创建过多非聚簇索引。过多索引增加维护成本和磁盘占用,需定期清理冗余索引:
    SHOW INDEX FROM users;
    DROP INDEX idx_unused ON users;
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912587.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912587.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912587.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[2025CVPR]DE-GANs:一种高效的生成对抗网络

目录 引言:数据高效GAN的困境 核心原理:动态质量筛选机制 1. 判别器拒绝采样(DRS)的再思考 2. 质量感知动态拒绝公式 (1)质量感知阶段 (2)动态拒绝阶段 模型架构:轻量化设计 技术突破:三大创新点 1. 首创训练阶段DRS 2. 动态拒绝机制 3. 质量重加权策略 …

[面试] 手写题-数组转树

示例数据&#xff1a; const arr [{ id: 1, parentId: null, name: Root },{ id: 2, parentId: 1, name: Child 1 },{ id: 3, parentId: 1, name: Child 2 },{ id: 4, parentId: 2, name: Grandchild 1 }, ]目标生成&#xff1a; const tree [{id: 1,name: Root,children: …

CertiK《Hack3d:2025年第二季度及上半年Web3.0安全报告》(附报告全文链接)

CertiK《Hack3d&#xff1a;2025年第二季度及上半年Web3.0安全报告》现已发布&#xff0c;报告显示&#xff1a;仅2025年上半年&#xff0c;因安全事件导致的损失接近25亿美元&#xff1b;截至目前&#xff0c;总损失已超过去年全年水平。整体来看&#xff0c;Web3.0安全形势依…

反向传播 梯度消失

反向传播 backpropagation 反向传播&#xff08;Backpropagation&#xff09; 是神经网络训练中的一种核心算法&#xff0c;用于通过计算误差并将其传播回网络&#xff0c;从而更新神经网络的参数。通过反向传播&#xff0c;网络能够在每次迭代中逐步调整其参数&#xff08;例…

京东外卖服务商加入方案对比!选择本地生活服务商系统的优势,到底在哪?

自入局之日起&#xff0c;京东外卖似乎就一直热衷于给人惊喜&#xff1a; 先是在上线时规定了“2025年5月1日前入驻的商家&#xff0c;全年免佣金”和“仅限品质堂食商家入驻”&#xff1b; 再是宣布了要为外卖骑手缴纳五险一金&#xff0c;并承担其中的所有成本&#xff1b;…

【RTSP从零实践】4、使用RTP协议封装并传输AAC

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Bootstrap 安装使用教程

一、Bootstrap 简介 Bootstrap 是一个开源的前端框架&#xff0c;由 Twitter 开发&#xff0c;旨在快速开发响应式、移动优先的 Web 页面。它包含 HTML、CSS 和 JavaScript 组件&#xff0c;如按钮、导航栏、表单等。 二、Bootstrap 安装方式 2.1 使用 CDN&#xff08;推荐入…

Java学习第二部分——基础语法

目录 一.数据类型 &#xff08;一&#xff09;数值类型&#xff08;用于存储数字&#xff0c;包括整数和浮点数&#xff09; 1. **整数类型** 2. **浮点类型** &#xff08;二&#xff09;非数值类型&#xff08;非数值类型用于存储非数字数据&#xff09; 1. **char** 2…

Redis分布式锁核心原理源码

文章目录 概述一、Redis实现分布式锁1.1、第一版1.2、第二版1.3、第三版1.3、第四版 二、Redisson实现分布式锁核心源码分析2.1、加锁核心源码2.2、锁续期核心源码2.3、重试机制核心源码2.4、解锁核心源码 总结 概述 传统的单机锁&#xff08;Synchronized&#xff0c;Reentran…

关于vue2使用elform的rules校验

在使用vue2开发项目的时候使用element组件的el-form大多数情况都需要用到必填项校验 举个栗子&#xff1a; <el-form :model"ruleForm" :rules"rules" ref"ruleForm" label-width"100px" class"demo-ruleForm"><e…

langchain从入门到精通(二十六)——RAG优化策略(四)问题分解策略提升负责问题检索准确率

1. LangChain 少量示例提示模板 在与 LLM 的对话中&#xff0c;提供少量的示例被称为 少量示例&#xff0c;这是一种简单但强大的指导生成的方式&#xff0c;在某些情况下可以显著提高模型性能&#xff08;与之对应的是零样本&#xff09;&#xff0c;少量示例可以降低 Prompt…

Nuxt.js基础(Tailwind基础)

​​1. 按钮组件实现​​ ​​传统 CSS <!-- HTML --> <button class"btn-primary">提交</button><!-- CSS --> <style>.btn-primary {background-color: #3490dc;padding: 0.5rem 1rem;border-radius: 0.25rem;color: white;transi…

[C语言]存储结构详解

C语言存储结构总结 在C语言中&#xff0c;数据根据其类型和声明方式被存储在不同的内存区域。以下是各类数据存储位置的详细总结&#xff1a; 内存五大分区 存储区存储内容生命周期特点代码区(.text)程序代码(机器指令)整个程序运行期只读常量区(.rodata)字符串常量、const全…

【实战】 容器中Spring boot项目 Graphics2D 画图中文乱码解决方案

场景 架构&#xff1a;spring boot 容器技术&#xff1a;docker 服务器&#xff1a;阿里云 开发环境&#xff1a;windows10 IDEA 一、问题 服务器中出现Graphics2D 画图中文乱码 本地环境运行正常 二、原因 spring boot 容器中没有安装中文字体 三、解决方案 安装字体即可 …

深入浅出:Vue2 数据劫持原理剖析

目录 一、什么是数据劫持&#xff1f; 二、核心 API&#xff1a;Object.defineProperty 三、Vue2 中的数据劫持实现 1. 对象属性的劫持 2. 嵌套对象的处理 3. 数组的特殊处理 四、结合依赖收集的完整流程 五、数据劫持的局限性 六、Vue3 的改进方案 总结 一、什么是数…

数据湖 vs 数据仓库:数据界的“自来水厂”与“瓶装水厂”?

数据湖 vs 数据仓库&#xff1a;数据界的“自来水厂”与“瓶装水厂”&#xff1f; 说起“数据湖”和“数据仓库”&#xff0c;很多刚入行的朋友都会觉得&#xff1a; “听起来好高大上啊&#xff01;但到底有啥区别啊&#xff1f;是湖更大还是仓库更高端&#xff1f;” 我得说…

Node.js-path模块

Path 模块 path 模块提供了 操作路径 的功能&#xff0c;我们将介绍如下几个较为常用的几个 API ​​path.resolve([…paths]) 将路径片段​​解析为绝对路径​​&#xff08;从右向左拼接&#xff0c;遇到绝对路径停止&#xff09; // 若参数为空&#xff0c;返回当前工作目…

Java面试题029:一文深入了解MySQL(1)

欢迎大家关注我的专栏,该专栏会持续更新,从原理角度覆盖Java知识体系的方方面面。 一文吃透JAVA知识体系(面试题)https://blog.csdn.net/wuxinyan123/category_7521898.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=7521898&

vue3.0所采用得Composition Api与Vue2.XOtions Api有什么不同?

Vue 3.0 引入的 Composition API 相较于 Vue 2.x 的 Options API 有显著的不同。下面从几个方面对比这两者的差异&#xff1a; ✅ 1. 代码组织方式不同 Vue 2.x — Options API 使用 data、methods、computed、watch 等分散的选项组织逻辑。 每个功能点分散在不同的选项中&am…

【IP 潮玩行业深度研究与学习】

潮玩行业发展趋势分析&#xff1a;全球市场格局与中国政策支持体系 潮玩产业正经历从"小众收藏"到"大众情绪消费"的深刻转型&#xff0c;2025年中国潮玩市场规模已达727亿元&#xff0c;预计2026年将突破1100亿元&#xff0c;年复合增长率高达26%。这一千…