MySQL InnoDB 引擎中的聚簇索引和非聚簇索引的区别

在 MySQL 的 InnoDB 存储引擎中,聚簇索引和非聚簇索引是两种常见的索引类型,它们在数据存储结构和使用场景上有显著区别。


1. 聚簇索引(Clustered Index)

特点

  1. 数据和索引存储在一起

    • InnoDB 表的主键索引是聚簇索引,数据行存储在叶子节点中。
    • 索引按照主键值排序,数据行的存储顺序与索引顺序一致。
  2. 一个表只能有一个聚簇索引

    • 因为表的数据行只能存储一次,因此只能根据一个索引进行聚簇。
  3. 高效范围查询

    • 聚簇索引适合范围查询,因为数据是物理上连续存储的。
  4. 回表操作减少

    • 查询主键索引时,无需再次从其他位置读取数据行。

缺点

  1. 主键过大影响性能

    • 主键列较长会导致索引占用更多空间,降低性能。
  2. 插入速度受排序影响

    • 新数据插入时需要维护顺序,可能引发页分裂,导致性能下降。

存储结构

  • 以 B+ 树为基础构建,叶子节点存储的是完整的数据行。

2. 非聚簇索引(Secondary Index)

特点

  1. 数据和索引分开存储

    • 索引的叶子节点存储的是主键值而非完整的数据行。
  2. 支持多个非聚簇索引

    • 一个表可以有多个非聚簇索引。
  3. 查询时需要回表

    • 查询非聚簇索引时,通过主键值回到聚簇索引查找完整数据行。

优点

  1. 支持更多的查询优化

    • 可以为需要频繁查询的非主键列建立索引。
  2. 灵活性高

    • 多个非聚簇索引可以覆盖不同的查询场景。

缺点

  1. 查询可能较慢

    • 需要通过主键值回表查找完整数据行,增加查询时间。
  2. 占用更多存储空间

    • 每个非聚簇索引都需要单独的存储空间。

存储结构

  • 以 B+ 树为基础构建,叶子节点存储的是主键值。

3. 聚簇索引与非聚簇索引的对比

对比项 聚簇索引 非聚簇索引
存储结构 数据行存储在叶子节点 叶子节点存储主键值
数据顺序 数据按主键顺序存储 数据存储与索引无关
支持数量 每个表只能有一个 一个表可以有多个
回表操作 不需要 查询完整数据时需要回表
空间占用 较少 较多
查询效率 主键查询和范围查询更高效 需要回表时效率较低
适用场景 主键查询、范围查询 查询非主键列

4. 总结

  • 聚簇索引

    • 将数据和索引存储在一起,查询主键效率高,但插入性能可能受影响。
    • 适合对主键频繁查询或排序的场景。
  • 非聚簇索引

    • 数据和索引分开存储,支持灵活的查询优化,但需要回表查找数据。
    • 适合对非主键列频繁查询的场景。

在设计表时,需要根据查询需求合理选择索引类型,以优化查询性能。

MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?的更多相关文章

  1. MySQL中Innodb的聚簇索引和非聚簇索引

    聚簇索引 数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引(又叫二级索引)两种.Innodb的聚簇索引在同一个B-Tree中保存了索引列和具体的数据,在聚簇索引中,实际的数据保存在叶子页中, ...

  2. MYSQL性能调优: 对聚簇索引和非聚簇索引的认识

    聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法.特点是存储数据的顺序和索引顺序一致.一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引. 在<数据库原理&g ...

  3. MySQL 聚簇索引和非聚簇索引的认识

    聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法.特点是存储数据的顺序和索引顺序一致.一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引. 在<数据库原理&g ...

  4. mysql索引总结(3)-MySQL聚簇索引和非聚簇索引

    mysql索引总结(1)-mysql 索引类型以及创建 mysql索引总结(2)-MySQL聚簇索引和非聚簇索引 mysql索引总结(3)-MySQL聚簇索引和非聚簇索引 mysql索引总结(4)-M ...

  5. mysql索引总结(2)-MySQL聚簇索引和非聚簇索引

    mysql索引总结(1)-mysql 索引类型以及创建 mysql索引总结(2)-MySQL聚簇索引和非聚簇索引 mysql索引总结(3)-MySQL聚簇索引和非聚簇索引 mysql索引总结(4)-M ...

  6. mysql 聚簇索引、非聚簇索引的区别

    索引分为聚簇索引和非聚簇索引. 以一本英文课本为例,要找第8课,直接翻书,若先翻到第5课,则往后翻,再翻到第10课,则又往前翻.这本书本身就是一个索引,即"聚簇索引". 如果要找& ...

  7. mysql索引之聚簇索引与非聚簇索引

    1 数据结构及算法基础 1.1 索引的本质 官方定义:索引(Index)是帮助MySQL高效获取数据的数据结构 本质:索引是数据结构 查询是数据库的最主要功能之一.我们都希望查询速度能尽可能快,因此数 ...

  8. 【Mysql优化】聚簇索引与非聚簇索引概念

    必须为主键字段创建一个索引,这个索引就是所谓的"主索引".主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE.  首先明白两句话: innod ...

  9. 一分钟明白MySQL聚簇索引和非聚簇索引

    MySQL的InnoDB索引数据结构是B+树,主键索引叶子节点的值存储的就是MySQL的数据行,普通索引的叶子节点的值存储的是主键值,这是了解聚簇索引和非聚簇索引的前提 什么是聚簇索引? 很简单记住一 ...

  10. 巧用MySQL InnoDB引擎锁机制解决死锁问题(转)

    该文会通过一个实际例子中的死锁问题的解决过程,进一步解释innodb的行锁机制 最近,在项目开发过程中,碰到了数据库死锁问题,在解决问题的过程中,笔者对MySQL InnoDB引擎锁机制的理解逐步加深 ...

随机推荐

  1. .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?

    昨天线上有几个进程因为 StackOverFlowException 导致进程 Crash 了,但是 TCP 请求还是可以连接,具体可不可以连接一个出现StackOverFlowException的微 ...

  2. [阿里DIN] 模型保存,加载和使用

    [阿里DIN] 模型保存,加载和使用 0x00 摘要 Deep Interest Network(DIN)是阿里妈妈精准定向检索及基础算法团队在2017年6月提出的.其针对电子商务领域(e-comme ...

  3. Vue实现企业微信扫码登录

        Vue实现企业微信扫码登录   企业微信扫码登录原理 构建企业微信登录二维码 获取访问令牌access_token 请求方式:GET(HTTPS)请求URL:https://qyapi.wei ...

  4. autMan奥特曼机器人-代理池配置教程

    一.优势: 全可视化 稳如老牛(从2.8.6开始) 隧道代理和接口获取,使用灵活 代理池运行状态指令可查:代理池 二.启用代理池并设置服务端口 代理池的启用与关闭,均为重启autMan生效 设置隧道代 ...

  5. Forest v1.5.13 发布,声明式 HTTP 框架,已超 1.8k star

    Forest介绍 Forest 是一个开源的 Java HTTP 客户端框架,它能够将 HTTP 的所有请求信息(包括 URL.Header 以及 Body 等信息)绑定到您自定义的 Interfac ...

  6. Dify 和 Manus 的技术架构差异

    Dify 框架能够部分实现 Manus 的功能效果,但在复杂任务自动化.多代理协作等领域存在技术差距. 一.核心功能对比 1. 任务拆解与执行能力 Dify:支持通过 Agent 模式 进行任务分解, ...

  7. 【基础知识笔记】001 MATLAB-plotyy-函数详解

    plot 1 定义 plot()--matlab中二维画图的函数,函数返回值是各个线条的句柄. 2 调用格式 2.1 plot(y) 当y为向量时,是以y的分量为纵坐标,以元素序号为横坐标,用直线依次 ...

  8. 【小鼓捣】手搓Verilog-CPU测试全流程自动化

    自动化流程思路 1.C++/Python:生成大量包含指定指令的mips程序(A.asm) 2.命令行:导出该mips程序指令的机器码(A.txt) 3.魔改MARS:产生测试所需的IM.DM存入信息 ...

  9. Golang入门:Linux上的go语言安装与配置

    Tips:本文以本文撰写时的 Go 语言最新版本,也就是 go.1.19.2 版本为例. Linux 发行版本使用 Ubuntu 22.04.1 LTS 为例来做演示. 安装 C 工具 Go 的工具链 ...

  10. 认识webRTC

    什么是 WebRTC 2010 年 5 月,谷歌收购了 Global IP Solutions(简称 GIPS),这是一家专注于 VoIP 和视频会议软件的公司,已开发出 RTC 所需的多项关键组件, ...