【MySQL筑基篇】新手必看:聚簇索引、非聚簇索引与回表,一篇扫清盲区
【MySQL筑基篇】新手必看聚簇索引、非聚簇索引与回表一篇扫清盲区MySQL特别是默认存储引擎InnoDB的索引体系中聚簇索引和非聚簇索引也叫二级索引、辅助索引是理解查询性能的关键。很多人把它们搞混也不知道什么是“回表”以及如何避免它。这篇文章用最通俗的语言 图解思路把这三个概念彻底讲透。1. 先搞清楚一个核心区别索引和数据是“在一起”还是“分开”概念数据与索引关系InnoDB 中的典型代表叶子节点存什么一个表能有几个聚簇索引(Clustered Index)数据行和索引放在一起主键索引通常整行数据所有字段只能有1个非聚簇索引(Non-Clustered Index / Secondary Index)索引和数据分开存放普通索引、唯一索引、复合索引索引列 主键值可以有多个一句话总结聚簇索引索引即数据找到索引就找到了整行。非聚簇索引索引只是目录找到索引后还得拿着“门牌号”主键再去找真正的数据。2. InnoDB 的聚簇索引到底长什么样InnoDB 表的数据是按主键顺序物理存储的B树结构。主键就是聚簇索引最常见情况如果你没定义主键InnoDB 会找第一个唯一且非空的索引来当聚簇索引再没有的话自动生成一个6字节的隐藏ROW_ID作为聚簇索引叶子节点直接存整行记录所有列非叶子节点存的是索引键 指针。示意图聚簇索引主键索引聚簇索引 B树 非叶子节点 17 → 指针 35 → 指针 ↓ ↓ 叶子节点 id17, name张三, age25, ... (整行) id20, name李四, age30, ... (整行) id35, name王五, age28, ... (整行)结论用主键精确查找或主键范围查找是最快的因为不需要任何额外操作。3. 非聚簇索引二级索引长什么样非聚簇索引的叶子节点不存整行数据只存你索引的列值主键值InnoDB 的关键设计示意图假设在 name 字段建了普通索引 idx_name二级索引 idx_name B树 非叶子节点 李四 → 指针 王五 → 指针 ↓ ↓ 叶子节点 name李四, id20 name王五, id35 name张三, id174. 什么是“回表”为什么它很伤性能回表通过非聚簇索引查到了主键值但查询需要的字段不在这个索引里就必须拿着主键再去聚簇索引里查一次整行这个过程就叫回表。回表示例最典型的情况CREATETABLEuser(idBIGINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(50),ageINT,cityVARCHAR(50),KEYidx_name_age(name,age)-- 复合索引);SELECTname,age,cityFROMuserWHEREname张三;执行过程先走 idx_name_age 索引 → 找到所有 name‘张三’ 的记录拿到对应的 id 值主键拿着这些 id → 回聚簇索引主键索引 → 查出整行 → 取出 city 字段这就是一次回表→多了一次随机IO。5. 如何避免回表→ 覆盖索引Covering Index覆盖索引查询所需的所有字段都能从当前索引的叶子节点直接拿到不需要回表。最常见的两种写法查询字段 ≤ 索引字段包含主键使用复合索引把 select 需要的字段都包含进去覆盖索引示例避免回表-- 情况1只查索引列 主键SELECTname,idFROMuserWHEREname张三;-- 覆盖索引无回表-- 情况2复合索引覆盖所有查询字段SELECTname,age,cityFROMuserWHEREname张三ANDage25;-- 如果有索引 (name, age, city)则完全覆盖无回表explain 看是否回表看 Extra 列是否有Using index覆盖索引。Extra: Using index → 好没回表 Extra: Using index condition → 索引下推 Extra: (空) 或 Using where → 可能回表6. 快速对比表建议收藏场景使用索引类型是否回表性能排序典型SQL示例SELECT * WHERE id 100聚簇索引否★★★★★主键精确查找SELECT * WHERE name ‘张三’非聚簇索引是大概率★★☆☆☆普通索引查全表字段SELECT name WHERE name ‘张三’非聚簇索引否覆盖★★★★☆只查索引列SELECT name,age,city WHERE name‘张三’ AND age20复合索引(name,age,city)否覆盖★★★★☆复合索引覆盖所有查询字段SELECT * ORDER BY id聚簇索引否★★★★★主键顺序扫描7. 常见面试/优化问题Q1为什么 InnoDB 强烈建议每张表都定义主键A没有主键 InnoDB 会生成隐藏 ROW_ID 作为聚簇索引性能差且二级索引会变大。Q2为什么不把所有字段都加到索引里做覆盖索引A索引太大 → 占用内存多、B树层级变高、写性能下降、维护成本高。Q3联合索引复合索引最左前缀原则和回表有关系吗有。能命中最左前缀才能走索引走索引后是否回表还要看 select 的字段是否被覆盖。Q4MyISAM 是聚簇索引吗不是。MyISAM 是典型的非聚簇索引主键索引叶子节点存的是数据行物理地址所有索引都是非聚簇的。总结一句话记住三者关系聚簇索引数据和索引在一起 → 主键 聚簇索引 最快非聚簇索引只存索引列 主键 → 查非索引列要回表回表非聚簇索引 → 拿着主键再查聚簇索引的过程覆盖索引让查询字段都在当前索引里 → 避免回表性能起飞掌握了这三个概念80%的索引优化问题就迎刃而解了。你现在对回表和覆盖索引清楚了吗有哪条 SQL 想分析是否会回表或者想看某个具体索引设计的案例可以贴出来我们一起看

相关新闻

Python学习之路-循环语句学习详解

Python学习之路-循环语句学习详解

Python 的循环语句是编程中最基础、最常用的控制结构之一,主要用于重复执行某段代码。Python 中主要有两种循环: for 循环 —— 适合已知次数或遍历序列的场景while 循环 —— 适合根据条件决定是否继续的场景 下面从基础到进阶,带你系统掌…

2026/7/3 14:24:45 阅读更多 →
YOLO26涨点改进 | 全网独家创新、注意力涨点改进篇 | CVPR 2025 | YOLO26引入SSA序列打乱注意力模块,含MSCSA二次创新模块、助力目标检测、图像分类、实例分割有效涨点

YOLO26涨点改进 | 全网独家创新、注意力涨点改进篇 | CVPR 2025 | YOLO26引入SSA序列打乱注意力模块,含MSCSA二次创新模块、助力目标检测、图像分类、实例分割有效涨点

一、本文介绍 🔥本文给大家介绍将 Sequence Shuffle Attention (SSA) 模块改进 YOLO26网络模型,可以显著提升模型的性能。SSA 通过捕捉长程依赖关系、保持图像的局部性与连续性,增强了对复杂场景和小目标的检测能力。同时,SSA 高效地聚合来自不同扫描方向的特征,减少冗余…

2026/7/3 14:24:48 阅读更多 →
学霸同款10个降AIGC平台 千笔AI帮你高效降AI率

学霸同款10个降AIGC平台 千笔AI帮你高效降AI率

AI降重工具:让论文更“自然”的秘密武器 在当前的学术写作环境中,AI生成内容(AIGC)已经成为了许多学生和研究者不得不面对的问题。尤其是在继续教育领域,如何有效降低AIGC率、去除AI痕迹,同时保持论文的语义…

2026/7/3 14:24:49 阅读更多 →

最新新闻

用AI变声神器RVC实现10分钟语音转换:从零开始的完整实战指南

用AI变声神器RVC实现10分钟语音转换:从零开始的完整实战指南

用AI变声神器RVC实现10分钟语音转换&#xff1a;从零开始的完整实战指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-C…

2026/7/4 8:31:20 阅读更多 →
从“是什么“到“为什么“:现代系统诊断工具witr如何重新定义进程分析范式

从“是什么“到“为什么“:现代系统诊断工具witr如何重新定义进程分析范式

从"是什么"到"为什么"&#xff1a;现代系统诊断工具witr如何重新定义进程分析范式 【免费下载链接】witr Why is this running? 项目地址: https://gitcode.com/GitHub_Trending/wi/witr 在当今复杂的系统环境中&#xff0c;当进程异常消耗资源、端…

2026/7/4 8:29:19 阅读更多 →
如何用Flask-profiler定位最耗时的API端点?实战案例分享

如何用Flask-profiler定位最耗时的API端点?实战案例分享

如何用Flask-profiler定位最耗时的API端点&#xff1f;实战案例分享 【免费下载链接】flask-profiler a flask profiler which watches endpoint calls and tries to make some analysis. 项目地址: https://gitcode.com/gh_mirrors/fl/flask-profiler Flask-profiler是…

2026/7/4 8:29:19 阅读更多 →
FlipperZeroHondaFirmware工作原理深度解析:433MHz RF信号捕获技术

FlipperZeroHondaFirmware工作原理深度解析:433MHz RF信号捕获技术

FlipperZeroHondaFirmware工作原理深度解析&#xff1a;433MHz RF信号捕获技术 【免费下载链接】FlipperZeroHondaFirmware Custom Firmware for the Flipper Zero, to add support for Honda key fobs (FCC ID: KR5V2X) 项目地址: https://gitcode.com/gh_mirrors/fl/Flippe…

2026/7/4 8:23:17 阅读更多 →
大模型‘养虾测试’:评估世界模型与长程一致性新标尺

大模型‘养虾测试’:评估世界模型与长程一致性新标尺

1. 项目概述&#xff1a;当“养虾”成为大模型能力测试的新标尺最近在好几个技术群和行业论坛里&#xff0c;频繁看到有人甩出一句&#xff1a;“来&#xff0c;养只虾试试&#xff1f;”——不是水产养殖交流&#xff0c;也不是美食探店邀约&#xff0c;而是工程师、产品经理、…

2026/7/4 8:19:17 阅读更多 →
智能解析技术赋能教育数字化转型:tchMaterial-parser的技术架构与应用实践

智能解析技术赋能教育数字化转型:tchMaterial-parser的技术架构与应用实践

智能解析技术赋能教育数字化转型&#xff1a;tchMaterial-parser的技术架构与应用实践 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具&#xff0c;帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#xff0c;让您更方便地获取课…

2026/7/4 8:15:16 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布&#xff0c;这是一个关键的安全修复版本&#xff0c;修复了多个方面的问题&#xff0c;还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出&#xff0c;mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南&#xff1a;使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL&#xff08;Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器&#xff0c;与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻