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

阿里二面:什么是 MySQL 回表查询?如何避免?(修订版)

在线 Java 面试刷题持续更新https://www.quanxiaoha.com/java-interview目录面试考察点核心答案深度解析一、InnoDB 索引结构理解回表的前提二、回表过程演示三、如何避免回表—— 覆盖索引四、如何判断是否发生回表五、覆盖索引的最佳实践面试高频追问常见面试变体记忆口诀总结面试考察点索引原理理解面试官不仅仅是想知道 回表 这个概念更是想考察你是否理解 InnoDB 的聚簇索引和二级索引的区别以及 B 树的存储结构。性能优化意识回表会带来额外的 I/O 开销考察你是否具备 减少回表次数 的优化思维能否在实际开发中设计出高效的索引。覆盖索引应用考察你是否掌握 覆盖索引 这一核心优化手段以及如何通过EXPLAIN命令判断是否发生了回表。核心答案回表查询当通过二级索引非主键索引查询数据时如果 SELECT 的字段不完全包含在索引中MySQL 需要先从二级索引树查到主键 ID再回到聚簇索引树根据 ID 查找完整记录这个过程叫 回表。核心对比查询类型索引类型是否回表性能主键查询聚簇索引❌ 不需要⭐⭐⭐⭐⭐ 最快覆盖索引查询二级索引字段全覆盖❌ 不需要⭐⭐⭐⭐ 快普通二级索引查询二级索引字段未覆盖✅ 需要回表⭐⭐⭐ 较慢一句话总结回表的本质是 二级索引 → 聚簇索引 的二次查找通过覆盖索引可以避免。深度解析一、InnoDB 索引结构理解回表的前提要理解回表首先要理解 InnoDB 的两种索引结构聚簇索引和二级索引结构对比上图对比了聚簇索引和二级索引的结构差异。关键区别在于聚簇索引主键索引叶子节点存储的是完整的行数据通过主键可以直接获取所有字段二级索引非主键索引叶子节点只存储索引列的值 主键 ID不包含其他字段这就是为什么二级索引查询可能需要 回表 —— 因为它没有完整的行数据 欢迎加入小哈的星球你将获得:专属的项目实战多个项目 / 1v1 提问 /Java 学习路线 /学习打卡 / 每月赠书 / 社群讨论新项目《Spring AI 项目实战》正在更新中..., 基于 Spring AI Spring Boot 3.x JDK 21;《从零手撸仿小红书微服务架构》 已完结基于 Spring Cloud Alibaba Spring Boot 3.x JDK 17..., 点击查看项目介绍演示地址http://116.62.199.48:7070/《从零手撸前后端分离博客项目全栈开发》2期已完结,演示链接http://116.62.199.48/;专栏阅读地址https://www.quanxiaoha.com/column截止目前累计输出 100w 字讲解图 4013 张还在持续爆肝中..后续还会上新更多项目目标是将 Java 领域典型的项目都整一波如秒杀系统, 在线商城, IM 即时通讯Spring Cloud Alibaba 等等戳我加入学习解锁全部项目已有4500小伙伴加入二、回表过程演示假设有一张用户表CREATE TABLE user ( id INT PRIMARY KEY, -- 主键 name VARCHAR(50), -- 姓名 age INT, -- 年龄 INDEX idx_name (name) -- name 列的二级索引 ); -- 插入测试数据 INSERT INTO user VALUES (1, Alice, 25); INSERT INTO user VALUES (2, Bob, 30); INSERT INTO user VALUES (3, Carol, 28);场景通过 name 查询完整数据SELECT * FROM user WHERE name Bob;这个查询会发生回表执行过程如下回表过程演示上图展示了回表的完整过程。核心步骤说明步骤一在二级索引idx_name中查找name Bob找到对应的主键id 3步骤二拿着主键id 3回到聚簇索引树中查找完整的行数据回表代价需要扫描两棵 B 树产生额外的 I/O 开销三、如何避免回表—— 覆盖索引覆盖索引Covering Index如果查询的所有字段都包含在索引中MySQL 就不需要回表直接从索引树获取数据即可。优化前会回表-- 查询 name 和 age但 idx_name 索引只有 name没有 age -- 所以需要回表获取 age 字段 SELECT name, age FROM user WHERE name Bob;优化后不回表-- 创建联合索引包含 name 和 age CREATE INDEX idx_name_age ON user(name, age); -- 再次查询name 和 age 都在索引中不需要回表 SELECT name, age FROM user WHERE name Bob;回表查询和覆盖索引对比上图对比了回表查询和覆盖索引的执行差异。覆盖索引的核心优势减少 I/O只扫描一棵 B 树避免回表的额外 I/O提升性能特别是高并发场景减少 I/O 意味着更高的 QPS索引下推MySQL 5.6 之后覆盖索引还能配合 ICP 进一步优化四、如何判断是否发生回表使用EXPLAIN命令查看执行计划关注Extra字段-- 会回表的查询 EXPLAIN SELECT * FROM user WHERE name Bob;字段值含义typeref使用了二级索引keyidx_name使用的索引名ExtraNULL❌ 没有使用覆盖索引需要回表-- 覆盖索引查询不回表 EXPLAIN SELECT name, age FROM user WHERE name Bob;字段值含义typeref使用了二级索引keyidx_name_age使用的联合索引ExtraUsing index✅ 使用了覆盖索引不回表关键指标Extra字段出现Using index表示使用了覆盖索引不会回表。五、覆盖索引的最佳实践1. 高频查询字段建联合索引-- 业务高频查询SELECT name, age FROM user WHERE name ? CREATE INDEX idx_name_age ON user(name, age);2. 遵循最左前缀原则-- 联合索引 (name, age, phone) CREATE INDEX idx_name_age_phone ON user(name, age, phone); -- ✅ 走覆盖索引 SELECT name, age FROM user WHERE name Bob; -- 用到 name SELECT name, age, phone FROM user WHERE name Bob; -- 用到 name, age, phone SELECT name, age FROM user WHERE name Bob AND age 30; -- 用到 name, age -- ❌ 不走覆盖索引违反最左前缀 SELECT name, age FROM user WHERE age 30; -- 没有 name 条件3. 避免 SELECT *-- ❌ 可能导致回表 SELECT * FROM user WHERE name Bob; -- ✅ 只查需要的字段利用覆盖索引 SELECT name, age FROM user WHERE name Bob;面试高频追问追问一主键查询和二级索引查询有什么区别答主键查询直接走聚簇索引叶子节点存完整数据不需要回表二级索引查询如果字段不覆盖需要先查主键 ID 再回表查完整数据。追问二为什么不建议用SELECT *答SELECT *会查询所有字段如果走二级索引大概率字段不全覆盖必须回表而明确指定字段可以设计覆盖索引避免回表提升性能。追问三联合索引的设计原则是什么答遵循 最左前缀原则将高频查询条件放左边覆盖查询字段放右边同时考虑区分度区分度高的字段放前面。常见面试变体什么是覆盖索引它有什么优势为什么主键查询比二级索引查询快如何优化 SQL 减少 I/O 次数EXPLAIN 的 Extra 字段中 Using index 是什么意思记忆口诀回表与覆盖索引二级索引存 ID叶子节点不存完整数据回表查聚簇拿着 ID 再查一次覆盖免回表查询字段全在索引中总结回表是 InnoDB 通过二级索引查询时因索引不包含完整数据而需要二次查找聚簇索引的过程。避免回表的核心手段是覆盖索引—— 将查询涉及的字段都放入联合索引使 MySQL 能直接从索引树获取所有数据。生产环境中应避免SELECT *根据高频查询设计合理的联合索引。 欢迎加入小哈的星球你将获得:专属的项目实战多个项目 / 1v1 提问 /Java 学习路线 /学习打卡 / 每月赠书 / 社群讨论新项目《Spring AI 项目实战》正在更新中..., 基于 Spring AI Spring Boot 3.x JDK 21;《从零手撸仿小红书微服务架构》 已完结基于 Spring Cloud Alibaba Spring Boot 3.x JDK 17..., 点击查看项目介绍演示地址http://116.62.199.48:7070/《从零手撸前后端分离博客项目全栈开发》2期已完结,演示链接http://116.62.199.48/;专栏阅读地址https://www.quanxiaoha.com/column截止目前累计输出 100w 字讲解图 4013 张还在持续爆肝中..后续还会上新更多项目目标是将 Java 领域典型的项目都整一波如秒杀系统, 在线商城, IM 即时通讯Spring Cloud Alibaba 等等戳我加入学习解锁全部项目已有4500小伙伴加入1. 我的私密学习小圈子从0到1手撸企业实战项目~ 2. 如何画出一张优秀的架构图老鸟必备 3. 面试官说说动态线程池实现原理 4. 实战Arthas 定位 接口的超时问题直接起飞最近面试BAT整理一份面试资料《Java面试BATJ通关手册》覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。 获取方式点“在看”关注公众号并回复 Java 领取更多内容陆续奉上。PS因公众号平台更改了推送规则如果不想错过内容记得读完点一下“在看”加个“星标”这样每次新文章推送才会第一时间出现在你的订阅列表里。 点“在看”支持小哈呀谢谢啦

相关文章:

阿里二面:什么是 MySQL 回表查询?如何避免?(修订版)

在线 Java 面试刷题(持续更新):https://www.quanxiaoha.com/java-interview 目录 面试考察点核心答案深度解析一、InnoDB 索引结构:理解回表的前提二、回表过程演示三、如何避免回表?—— 覆盖索引四、如何判断是否发生…...

环境配置——python代码打包超详细教程

在Python开发的过程中我们经常会需要将自己的代码打包成一个可执行文件,方便将代码分享给其他人使用,下面这篇文章主要给大家介绍了关于python代码打包的相关资料,需要的朋友可以参考下一、前言网上的文章对小白都不太友好呀,讲得都比较高大上,本文章就用…...

利用DeOldify进行影视资料修复:批量视频帧上色处理方案

利用DeOldify进行影视资料修复:批量视频帧上色处理方案 每次看到那些珍贵的历史影像资料,总是觉得有些遗憾。黑白画面虽然经典,但总感觉隔了一层纱,人物的表情、环境的细节,都少了些温度和真实感。对于影视资料馆、纪…...

PHP-Resque源码解析:深入剖析核心类Resque_Job和Resque_Worker的实现原理

PHP-Resque源码解析:深入剖析核心类Resque_Job和Resque_Worker的实现原理 【免费下载链接】php-resque PHP port of resque (Workers and Queueing) 项目地址: https://gitcode.com/gh_mirrors/ph/php-resque PHP-Resque是Redis支持的PHP后台作业处理库&…...

Squirrel-RIFE常见问题解决方案:从安装到使用的完整排错

Squirrel-RIFE常见问题解决方案:从安装到使用的完整排错 【免费下载链接】Squirrel-RIFE 项目地址: https://gitcode.com/gh_mirrors/sq/Squirrel-RIFE Squirrel-RIFE是一款基于RIFE算法的中文视频插帧软件,能够将视频帧率提升至60fps甚至更高&a…...

腾讯开源翻译大模型实战:HY-MT1.5-1.8B快速上手体验

腾讯开源翻译大模型实战:HY-MT1.5-1.8B快速上手体验 1. 引言:从零开始,十分钟拥有自己的翻译引擎 你有没有遇到过这样的场景?想给国外的朋友发一段中文消息,却担心翻译软件不准;阅读一份外文技术文档&…...

VSCP-Arduino:面向嵌入式节点的轻量级语义化IoT协议栈

1. 项目概述VSCP-Arduino 是一个面向 Arduino 平台的VSCP Level 1(L1)协议栈实现,专为资源受限的嵌入式节点设计。它并非通用通信库,而是严格遵循《VSCP Specification v1.5》中定义的 Level 1 设备行为规范,将物理层抽…...

手把手教你用LingBot-Depth:RGB-D数据融合的5步完整流程

手把手教你用LingBot-Depth:RGB-D数据融合的5步完整流程 1. 环境准备与快速部署 LingBot-Depth是一个基于DINOv2 ViT-L/14编码器的深度估计与补全模型,能够将RGB图像与稀疏深度数据融合生成高质量的完整深度图。在开始使用前,我们需要先完成…...

Qwen2.5-VL-7B-Instruct多场景案例:跨境电商商品图合规审查自动化

Qwen2.5-VL-7B-Instruct多场景案例:跨境电商商品图合规审查自动化 1. 项目背景与价值 跨境电商平台每天需要处理海量商品图片,确保这些图片符合各国法规要求是一项耗时费力的工作。传统人工审核方式存在效率低、成本高、标准不统一等问题。Qwen2.5-VL-…...

STM32内部六大总线架构与协同机制详解

1. STM32单片机内部总线架构解析在嵌入式系统开发实践中,理解MCU内部总线结构是掌握性能瓶颈、优化代码执行效率、调试异常行为以及合理规划外设访问时序的基础。对于基于ARM Cortex-M3内核的STM32F1系列微控制器(如STM32F103xB/C/E)&#xf…...

ROS2 Navigation Framework and System导航系统国际化支持方案:为全球机器人应用赋能

ROS2 Navigation Framework and System导航系统国际化支持方案:为全球机器人应用赋能 【免费下载链接】navigation2 ROS2 Navigation Framework and System 项目地址: https://gitcode.com/gh_mirrors/na/navigation2 ROS2 Navigation Framework and System&…...

Lingbot-Depth-Pretrain-Vitl-14 应用:机器人视觉导航中的深度感知实战

Lingbot-Depth-Pretrain-Vitl-14 应用:机器人视觉导航中的深度感知实战 想让机器人像人一样“看清”周围环境的远近,自主避开障碍物,甚至规划出一条安全的行走路线吗?这背后离不开一项关键技术——深度感知。简单来说&#xff0c…...

零基础玩转Pi0具身智能:浏览器一键体验机器人动作生成

零基础玩转Pi0具身智能:浏览器一键体验机器人动作生成 1. 从零开始:什么是Pi0具身智能? 你可能听说过机器人、人工智能,但“具身智能”这个词听起来有点陌生。简单来说,具身智能就是让AI拥有“身体”,能像…...

Qwen2.5-VL-7B-Instruct LangChain应用开发:智能体系统构建

Qwen2.5-VL-7B-Instruct LangChain应用开发:智能体系统构建 1. 引言 想象一下,你正在开发一个智能客服系统,用户不仅会发文字提问,还会上传截图、商品图片甚至操作界面。传统的文本AI只能处理文字,但现实中的问题往往…...

红外图像特征提取:从基础原理到实战应用

1. 红外图像与常规图像的差异 第一次接触红外图像时,我和大多数人一样困惑:这不就是黑白照片吗?直到在安防项目中踩了坑才明白,红外图像和灰度图像虽然看起来相似,但背后的物理原理完全不同。普通灰度图像记录的是物体…...

灵毓秀-牧神-造相Z-Turbo辅助C语言学习教程

灵毓秀-牧神-造相Z-Turbo辅助C语言学习教程 1. 引言:当AI绘画遇上编程学习 你可能用过各种工具来学习C语言,从厚重的教材到在线编译器,但用AI绘画模型来辅助编程学习,听起来是不是有点新鲜?其实,灵毓秀-牧…...

Word分节后页码混乱?3分钟搞定页码连续与PDF空白页问题

Word分节后页码混乱?3分钟搞定页码连续与PDF空白页问题 每次在Word里折腾几十页的论文或报告,最崩溃的瞬间莫过于发现页码莫名其妙从"1"重新开始,或者导出PDF时凭空多出几张空白页。这种问题往往发生在文档分节之后——你可能只是…...

2025 高效整理雪球内容:自动化下载与多格式导出实战

1. 为什么需要自动化整理雪球内容? 作为一个在金融信息领域摸爬滚打多年的老手,我深知及时获取和整理投资信息的重要性。雪球作为国内领先的投资社区,每天产生大量优质内容,但手动保存和整理这些内容简直是一场噩梦。想象一下&…...

斯坦福CS229中文翻译项目:EM算法与混合高斯模型深度解析

斯坦福CS229中文翻译项目:EM算法与混合高斯模型深度解析 【免费下载链接】Stanford-CS-229 A Chinese Translation of Stanford CS229 notes 斯坦福机器学习CS229课程讲义的中文翻译 项目地址: https://gitcode.com/gh_mirrors/st/Stanford-CS-229 欢迎来到斯…...

MAA助手:深度解析明日方舟智能自动化解决方案

MAA助手:深度解析明日方舟智能自动化解决方案 【免费下载链接】MaaAssistantArknights 一款明日方舟游戏小助手 项目地址: https://gitcode.com/GitHub_Trending/ma/MaaAssistantArknights MAA助手(MaaAssistantArknights)是一款专为《…...

IDA Pro逆向分析技巧:通过CTFshow-PWN题掌握汇编关键知识点

IDA Pro逆向分析实战:从CTFshow-PWN题透视汇编核心原理 逆向工程师的思维训练场 在网络安全竞赛的战场上,逆向工程能力就像一把瑞士军刀,既能剖析漏洞本质,也能构建防御策略。CTFshow平台上的PWN题目,特别是pwn5-pwn12…...

Open UI5 源代码解析之675:Dialog.js

源代码仓库: https://github.com/SAP/openui5 源代码位置:src\sap.m\src\sap\m\Dialog.js sap.m.Dialog 文件深度解析与项目作用说明 文件定位与整体价值 Dialog.js 是 sap.m 库里极其核心的交互基础设施之一。它并不只是一个 弹窗控件 的实现文件,更像是一个把视觉层、…...

比话降AI效果实测:知网检测从38.9%直接降到4.2%

比话降AI效果实测:知网检测从38.9%直接降到4.2% 有一类同学的情况比较特殊:论文AI率不算特别高,大概在30%-50%之间,属于那种"改一改可能能过,但也可能过不了"的灰色地带。 我就是这种情况。知网AIGC检测结果…...

集成学习与决策树:斯坦福CS229中文翻译项目高级算法解析

集成学习与决策树:斯坦福CS229中文翻译项目高级算法解析 【免费下载链接】Stanford-CS-229 A Chinese Translation of Stanford CS229 notes 斯坦福机器学习CS229课程讲义的中文翻译 项目地址: https://gitcode.com/gh_mirrors/st/Stanford-CS-229 斯坦福大学…...

Open UI5 源代码解析之676:DateTimePicker.js

源代码仓库: https://github.com/SAP/openui5 源代码位置:src\sap.m\src\sap\m\DateTimePicker.js DateTimePicker.js 深度解析与项目角色说明 文件定位与总体价值 DateTimePicker.js 是 sap.m 库里一个非常关键的输入控件实现文件,它把日期输入与时间输入融合为一个统…...

JavaScript字符串操作终极指南:20个实用方法深度解析

JavaScript字符串操作终极指南:20个实用方法深度解析 【免费下载链接】hello-javascript Curso para aprender el lenguaje de programacin JavaScript desde cero y para principiantes. 项目地址: https://gitcode.com/gh_mirrors/hel/hello-javascript Ja…...

Laravel CORS 缓存优化终极指南:max_age 配置与浏览器缓存策略详解

Laravel CORS 缓存优化终极指南:max_age 配置与浏览器缓存策略详解 【免费下载链接】laravel-cors 项目地址: https://gitcode.com/gh_mirrors/lar/laravel-cors 想要提升 Laravel API 性能?优化 CORS 缓存是关键!本指南将深入讲解 L…...

终极指南:如何为JavaScript NES模拟器添加TypeScript类型安全

终极指南:如何为JavaScript NES模拟器添加TypeScript类型安全 【免费下载链接】jsnes A JavaScript NES emulator. 项目地址: https://gitcode.com/gh_mirrors/js/jsnes JSNES是一个功能强大的JavaScript NES模拟器,它可以在浏览器和Node.js环境中…...

Superagent终极指南:如何通过API快速构建AI智能体应用

Superagent终极指南:如何通过API快速构建AI智能体应用 【免费下载链接】superagent 🥷 Run AI-agents with an API 项目地址: https://gitcode.com/gh_mirrors/super/superagent Superagent是一个强大的开源AI助手框架和API平台,专为开…...

如何快速掌握Octant:Kubernetes集群状态监控的终极指南

如何快速掌握Octant:Kubernetes集群状态监控的终极指南 【免费下载链接】octant 项目地址: https://gitcode.com/gh_mirrors/oct/octant Octant是一款专为开发者设计的Kubernetes集群监控工具,它通过直观的Web界面帮助用户理解应用在Kubernetes上…...