当前位置: 首页 > news >正文

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

MySQL InnoDB 存储引擎 中,索引主要分为 聚簇索引(Clustered Index)非聚簇索引(Secondary Index)。它们的主要区别如下:


1. 聚簇索引(Clustered Index)

定义

  • 聚簇索引是表数据存储的方式,即 索引和数据在一起叶子节点存储的是完整的行记录
  • InnoDB 中的主键索引就是聚簇索引(如果没有主键,InnoDB 会选择一个 UNIQUE 索引作为聚簇索引;如果没有 UNIQUE,InnoDB 会自动生成一个隐藏的 rowid)。

存储结构

  • 使用 B+ 树 结构存储,叶子节点存放 完整的行数据
  • 数据物理存储顺序和主键索引顺序一致。

特点

  • 访问主键索引时,直接获取整行数据,查询速度快。
  • 数据存储在主键索引的叶子节点上表本身就是一棵 B+ 树
  • 适用于 基于主键的查询、范围查询
  • 更新、删除、插入操作可能导致数据的页分裂,影响性能。

示例

CREATE TABLE users (id INT PRIMARY KEY,  -- 主键,自动成为聚簇索引name VARCHAR(50),age INT
);

users 表中,id 作为 聚簇索引,数据在磁盘上的存储顺序与 id 值的顺序相同。


2. 非聚簇索引(Secondary Index / 辅助索引)

定义

  • 非聚簇索引是独立于数据存储的索引叶子节点存储的是主键值,而不是完整的行数据。
  • 访问非聚簇索引时,需要先查找索引,再通过主键回表查询数据,这种过程称为 回表查询(回溯查询,Bookmark Lookup)

存储结构

  • 也是 B+ 树 结构,但叶子节点存储的是主键值,而非完整的行记录。

特点

  • 加速非主键列的查询(适用于 WHERE 条件非主键字段)。
  • 需要二次查询(先通过非聚簇索引找到主键值,再回表查询完整数据)。
  • 索引占用空间较大,需要额外存储主键值。

示例

CREATE TABLE users (id INT PRIMARY KEY,  -- 主键(聚簇索引)name VARCHAR(50),age INT,INDEX idx_name (name)  -- 非聚簇索引
);

如果执行:

SELECT * FROM users WHERE name = 'Alice';

查询过程如下:

  1. 先在 非聚簇索引 idx_name 中查找 Alice,获取其 主键 id
  2. 使用 id聚簇索引 中回表查找完整的行数据。

3. 聚簇索引 vs. 非聚簇索引

对比项聚簇索引(Clustered Index)非聚簇索引(Secondary Index)
存储结构叶子节点存储 完整行数据叶子节点存储 主键值
查询速度主键查询快(无需回表)非主键查询慢(需要回表)
插入速度(影响数据存储顺序)较快(不影响主键顺序)
更新操作影响数据物理存储顺序,可能导致页分裂更新可能导致回表查询增加
占用空间只存储数据本身需要存储 索引列 + 主键值,占用空间大
适用场景主键查询,范围查询查询非主键列,提高查询性能

4. 什么时候使用聚簇索引 vs. 非聚簇索引?

适合使用聚簇索引的场景

  • 主键查询多,如 WHERE id = 100;
  • 范围查询多,如 BETWEEN 100 AND 200;
  • 数据表的主键是有序递增的(如 AUTO_INCREMENT),避免页分裂。

适合使用非聚簇索引的场景

  • 查询非主键字段时,如 WHERE name = 'Alice';
  • 涉及联合查询,如 INDEX (name, age);
  • 表很大,不希望频繁回表查询(可以使用 覆盖索引,避免回表)。

5. 可能的优化方案

  1. 覆盖索引(Covering Index)

    • 避免回表,提高查询性能

    • 优化方法:如果查询的数据只包含索引字段,则直接从索引中获取数据,不需要回表。

    • 示例:

      CREATE INDEX idx_name_age ON users(name, age);
      SELECT name, age FROM users WHERE name = 'Alice';  -- 只查 name 和 age,不回表
      
  2. 使用合适的主键

    • 采用 自增主键,避免页分裂,提高插入性能。
    • 避免使用 UUID、随机值作为主键,会导致索引失效、性能下降。
  3. 减少回表查询

    • 索引覆盖查询,如 SELECT name FROM users WHERE name = 'Alice';
    • 适当调整索引列,如 INDEX (name, age) 避免多次回表。

总结

  • InnoDB 中的主键索引是聚簇索引,数据存储在 B+ 树的叶子节点上,查询主键时速度最快
  • 非聚簇索引存储的是主键值,查询时需要回表查询完整数据,适用于非主键查询场景。
  • 优化索引可以减少回表查询,提高 MySQL 查询性能

相关文章:

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

在 MySQL InnoDB 存储引擎 中,索引主要分为 聚簇索引(Clustered Index) 和 非聚簇索引(Secondary Index)。它们的主要区别如下: 1. 聚簇索引(Clustered Index) 定义 聚簇索引是表数…...

tomcat单机多实例部署

一、部署方法 多实例可以运行多个不同的应用,也可以运行相同的应用,类似于虚拟主机,但是他可以做负载均衡。 方式一: 把tomcat的主目录挨个复制,然后把每台主机的端口给改掉就行了。 优点是最简单最直接,…...

论文阅读分享——UMDF(AAAI-24)

概述 题目:A Unified Self-Distillation Framework for Multimodal Sentiment Analysis with Uncertain Missing Modalities 发表:The Thirty-Eighth AAAI Conference on Artificial Intelligence (AAAI-24) 年份:2024 Github:暂…...

解决asp.net mvc发布到iis下安全问题

解决asp.net mvc发布到iis下安全问题 环境信息1.The web/application server is leaking version information via the "Server" HTTP response2.确保您的Web服务器、应用程序服务器、负载均衡器等已配置为强制执行Strict-Transport-Security。3.在HTML提交表单中找不…...

概念|RabbitMQ 消息生命周期 待消费的消息和待应答的消息有什么区别

目录 消息生命周期 一、消息创建与发布阶段 二、消息路由与存储阶段 三、消息存活与过期阶段 四、消息投递与消费阶段 五、消息生命周期终止 关键配置建议 待消费的消息和待应答的消息 一、待消费的消息(Unconsumed Messages) 二、待应答的消息…...

springboot三层架构详细讲解

目录 springBoot三层架构 0.简介1.各层架构 1.1 Controller层1.2 Service层1.3 ServiceImpl1.4 Mapper1.5 Entity1.6 Mapper.xml 2.各层之间的联系 2.1 Controller 与 Service2.2 Service 与 ServiceImpl2.3 Service 与 Mapper2.4 Mapper 与 Mapper.xml2.5 Service 与 Entity2…...

2025最新群智能优化算法:云漂移优化(Cloud Drift Optimization,CDO)算法求解23个经典函数测试集,MATLAB

一、云漂移优化算法 云漂移优化(Cloud Drift Optimization,CDO)算法是2025年提出的一种受自然现象启发的元启发式算法,它模拟云在大气中漂移的动态行为来解决复杂的优化问题。云在大气中受到各种大气力的影响,其粒子的…...

2025年Draw.io最新版本下载安装教程,附详细图文

2025年Draw.io最新版本下载安装教程,附详细图文 大家好,今天给大家介绍一款非常实用的流程图绘制软件——Draw.io。不管你是平时需要设计流程图、绘制思维导图,还是制作架构图,甚至是简单的草图,它都能帮你轻松搞定。…...

记录--洛谷 P1451 求细胞数量

如果想查看完整题目,请前往洛谷 P1451 求细胞数量 P1451 求细胞数量 题目描述 一矩形阵列由数字 0 0 0 到 9 9 9 组成,数字 1 1 1 到 9 9 9 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形…...

Android Studio 配置国内镜像源

Android Studio版本号:2022.1.1 Patch 2 1、配置gradle国内镜像,用腾讯云 镜像源地址:https\://mirrors.cloud.tencent.com/gradle 2、配置Android SDK国内镜像 地址:Index of /AndroidSDK/...

做到哪一步才算精通SQL

做到哪一步才算精通SQL-Structured Query Language 数据定义语言 DDL for StructCREATE:用来创建数据库、表、索引等对象ALTER:用来修改已存在的数据库对象DROP:用来删除整个数据库或者数据库中的表TRUNCATE:用来删除表中所有的行…...

Manus演示案例: 英伟达财务估值建模 解锁投资洞察的深度剖析

在当今瞬息万变的金融投资领域,精准剖析企业价值是投资者决胜市场的关键。英伟达(NVIDIA),作为科技行业的耀眼明星,其在人工智能和半导体领域的卓越表现备受瞩目。Manus 凭借专业的财务估值建模能力,深入挖…...

postman接口请求中的 Raw是什么

前言 在现代的网络开发中,API 的使用已经成为数据交换的核心方式之一。然而,在与 API 打交道时,关于如何发送请求体(body)内容类型的问题常常困扰着开发者们,尤其是“raw”和“json”这两个术语之间的区别…...

DeepSeek大语言模型下几个常用术语

昨天刷B站看到复旦赵斌老师说的一句话“科幻电影里在人脑中植入芯片或许在当下无法实现,但当下可以借助AI人工智能实现人类第二脑”(大概是这个意思) 💞更多内容,可关注公众号“ 一名程序媛 ”,我们一起从 …...

ctf-WEB: 关于 GHCTF Message in a Bottle plus 与 Message in a Bottle 的非官方wp解法

Message in a Bottle from bottle import Bottle, request, template, runapp Bottle()# 存储留言的列表 messages [] def handle_message(message):message_items "".join([f"""<div class"message-card"><div class"me…...

测试用例详解

一、通用测试用例八要素   1、用例编号&#xff1b;    2、测试项目&#xff1b;   3、测试标题&#xff1b; 4、重要级别&#xff1b;    5、预置条件&#xff1b;    6、测试输入&#xff1b;    7、操作步骤&#xff1b;    8、预期输出 二、具体分析通…...

c#面试题整理7

1.UDP和TCP的区别 UDP是只要能连上终端就发送&#xff0c;至于终端是否收到&#xff0c;不管。 TCP则是会存在交换&#xff0c;即发送失败或成功&#xff0c;是可知的。 2.进程和线程的区别 双击一个程序的exe文件&#xff0c;程序执行了&#xff0c;这就是一个进程。 这个…...

OpenManus-通过源码方式本地运行OpenManus,含踩坑及处理方案,chrome.exe位置修改

前言&#xff1a;最近 Manus 火得一塌糊涂啊&#xff0c;OpenManus 也一夜之间爆火&#xff0c;那么作为程序员应该来尝尝鲜 1、前期准备 FastGithub&#xff1a;如果有科学上网且能正常访问 github 则不需要下载此软件&#xff0c;此软件是提供国内直接访问 githubGit&#…...

【性能测试】Jmeter下载安装、环境配置-小白使用手册(1)

本篇文章主要包含Jmeter的下载安装、环境配置 添加线程组、结果树、HTTP请求、请求头设置。JSON提取器的使用&#xff0c;用户自定义变量 目录 一&#xff1a;引入 1&#xff1a;软件介绍 2&#xff1a;工作原理 3&#xff1a;安装Jmeter 4&#xff1a;启动方式 &#xf…...

HTML星球大冒险之路线图

第一章&#xff1a;欢迎来到 HTML 星球&#xff01; 1.1 宇宙的基石&#xff1a;HTML 是什么&#xff1f; &#x1f30d; 比喻&#xff1a;HTML 是网页世界的「乐高积木」&#xff0c;用标签搭建一切可见内容&#x1f3af; 目标&#xff1a;理解 HTML 的作用&#xff0c;掌握…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...