h5打开以查看

“回表查询”通常发生在使用二级索引(Secondary Index)的查询中。当查询所需的数据列并不全部包含在二级索引中时,即使使用了索引,MySQL 也需要根据索引记录中的主键值,回到聚簇索引(Clustered Index)的主键 B+Tree 中去查找完整的行数据,这个过程就叫做“回表”。


核心方法:使用 EXPLAIN 命令

检测回表查询最主要、最直接的工具就是 MySQL 的 EXPLAIN 命令。你需要重点关注 EXPLAIN 输出中的以下几个字段:

1. type (访问类型)

这个字段显示了 MySQL 决定如何查找表中的行。

  • eq_ref, ref, range, index_scan: 这些通常是好的类型,表示使用了索引的有效查找。

  • index: 这是一个关键信号! type = index 通常意味着 MySQL 正在扫描整个二级索引(全索引扫描)。这通常发生在需要从索引中获取大量数据,然后回表的情况下。它比全表扫描(ALL)快,但依然不高效。

  • ALL: 最坏的情况,全表扫描,根本没用上索引。

2. key 和 key_len (使用的索引)
  • key: 显示 MySQL 实际决定使用的索引。

  • key_len: 显示使用的索引键的长度。通过这个长度,你可以判断索引是否被完全使用(覆盖了查询条件的所有列)。如果 key_len 小于索引定义的长度,说明只使用了索引的前面一部分,这可能不是最优的。

3. Extra (额外信息)

这是判断回表最重要的字段

  • Using index: 这是最理想的情况,表示出现了“覆盖索引”(Covering Index)。查询的所有字段都包含在使用的索引中,MySQL 只需要读取索引即可返回结果,完全不需要回表。这是优化的重要目标。

  • Using index condition: 表示使用了 Index Condition Pushdown (ICP) 优化,服务器层将部分条件(WHERE 子句)下推给存储引擎层进行过滤,但仍然可能需要回表

  • Using where: 这通常意味着需要回表。表示存储引擎从索引中读取行后,需要在 MySQL 服务器层再根据 WHERE 条件进行过滤。服务器层过滤的数据,就是已经从聚簇索引中取回的完整行数据。


实战演示:如何一步步检测

假设我们有一张用户表 users

sql

CREATE TABLE `users` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(100) DEFAULT NULL,`age` int DEFAULT NULL,`city` varchar(100) DEFAULT NULL,`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`id`),KEY `idx_name_age` (`name`,`age`) -- 一个联合索引
) ENGINE=InnoDB;
场景 1:覆盖索引,无需回表(理想情况)

sql

EXPLAIN SELECT name, age FROM users WHERE name = 'John';

分析 EXPLAIN 结果:

  • typeref (使用了索引等值查询)

  • keyidx_name_age (使用了我们创建的联合索引)

  • ExtraUsing index

    • 结论:太好了!查询的 name 和 age 字段都包含在 idx_name_age 索引中。MySQL 只需读取索引文件,无需回表,性能极高。

场景 2:需要回表的查询(常见情况)

sql

EXPLAIN SELECT * FROM users WHERE name = 'John';
-- 或者
EXPLAIN SELECT name, age, city FROM users WHERE name = 'John'; -- city 不在索引中

分析 EXPLAIN 结果:

  • typeref (依然使用了索引)

  • keyidx_name_age (使用了索引来快速定位记录)

  • ExtraNULL 或者 Using where

    • 结论:发生了回表。idx_name_age 索引中只有 (name, age, id)(id是主键,会自动附加到二级索引中),但没有 city 字段。为了获取 city 和 created_at 等所有字段,MySQL 必须根据找到的 id 值,回到聚簇索引中去查找完整的行数据。

场景 3:全索引扫描,然后回表

sql

EXPLAIN SELECT * FROM users WHERE age > 20;

分析 EXPLAIN 结果:

  • typeindex

  • keyidx_name_age

  • ExtraUsing where

    • 结论:这是一个非常典型的低效查询。我们的索引是 (name, age),但查询条件从 age 开始,无法使用索引的最左前缀原则。因此,MySQL 会选择扫描整个 idx_name_age 索引,对每一条索引记录检查 age > 20 的条件,然后为每一个匹配的索引记录回表获取完整数据。性能很差。


总结:检测与优化回表查询的步骤

  1. 使用 EXPLAIN: 对任何性能存疑的查询都使用 EXPLAIN 分析。

  2. 查看 Extra 列

    • 如果看到 Using index,恭喜你,没有回表。

    • 如果看到 Using where 且 type 是 ref 或 index,很可能发生了回表。

  3. 查看 type 列: 如果值是 index,说明正在全索引扫描,通常伴随着大量回表,需要优化。

  4. 优化策略

    • 创建覆盖索引: 如果回表查询很频繁,考虑创建一个“覆盖索引”,将查询中涉及的所有字段(SELECT 和 WHERE 中的字段)都包含在索引中。例如,对于 SELECT id, name, city FROM users WHERE name = ?,可以创建索引 (name, city) 或 (name, city, id) 来覆盖查询。

    • 避免 SELECT *: 只获取你真正需要的列,减少需要回表获取的数据量,也更容易实现覆盖索引。

    • 使用索引的最左前缀原则: 确保查询条件能有效利用索引。

通过系统性地使用 EXPLAIN 并关注上述关键字段,你可以准确地识别和优化数据库中的回表查询,从而极大提升查询性能。

h5打开以查看

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

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

相关文章

深度学习(二):神经元与神经网络

在人工智能的浪潮中,神经网络(Neural Networks)无疑是驱动核心技术的引擎,它赋予了计算机前所未有的学习和识别能力。而这一切的起点,是受到生物大脑中基本单元——神经元(Neurons)的深刻启发。…

JavaScript 行为型设计模式详解

1. 观察者模式1.1. 使用场景观察者模式用于对象间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都能收到通知并自动更新。常用于事件处理、通知系统。在前端中,观察者模式用于实现事件监听、数据绑定等功能。1.2. 代码实现…

指令查找表LUT

本文整理自22. FlexSPI—读写外部SPI NorFlash — [野火]i.MX RT库开发实战指南——基于i.MXRT1052 文档 用作个人学习和分享 指令查找表LUT 访问FLASH存储器通常包含一些读写功能的的控制指令,主控设备可通过这些指令访问FLASH存储器。 为了适应这种需求&#…

uv使用指南

🚀 Python 打包工具 UV 使用指南 UV 是一个用 Rust 编写的极速 Python 包管理器和解析器,旨在成为 pip、pip-tools、virtualenv 等工具的单一替代方案。 📋 目录 核心概念与设计哲学安装与配置基础使用方法项目管理与工作流高级功能与技巧…

安卓学习 之 图片控件和图片按钮

今天学习的是ImageView 和 ImageButton这两个控件还是比较简单的:先来看看最后的样式图片吧:从图片中可以看到ImageView中的图片要大很多,这是因为中的ImageView中的图片跟ImageView控件的大小而自动调整。Imag…

动态规划-学习笔记

这是一份动态规划(Dynamic Programming, DP)完整学习笔记。笔记将从一星难度(入门)到五星难度(进阶),循序渐进,涵盖核心思想、经典模型和解题方法论。 本来打算今天更新背包问题的题…

Linux 可信启动深度解析:从UEFI到操作系统的信任链

文章目录引言一、 可信根基:TPM与核心概念1.1 什么是“度量” (Measurement)?1.2 信任链与TPM PCR二、 阶段一:固件的可信启动 (UEFI)2.1 引导的起点:从SEC到DXE的初始化2.2 引导设备选择 (BDS):UEFI如何找到GRUB2.3 S…

61-python中面向对象三大特性

前言: 面向对象编程,是许多编程语言都支持的一种编程思想。简单理解是:基于模板(类)去创建实体(对象), 使用对象完成功能开发。面向对象包含三大主要特性: 封装 继承 多态…

BP-Adaboost模型

BP-Adaboost模型是一种将BP神经网络作为弱分类器的集成学习框架,通过AdaBoost算法动态调整样本权重和模型权重,显著提升预测精度和泛化能力。一、模型架构与工作原理 1. 基础框架 弱分类器单元:采用单隐藏层BP神经网络(结构示例&a…

k230 +canMV+ LVGL控件 仿手表表盘触摸屏滚动、选中后弹窗效果完整示例程序

现在智能手表用的越来越多,其交互方式比较有特点,现在k230开发板上,基于LVGL(Light and Versatile Graphics Library)编写一个嵌入式GUI应用程序,使用LVGL配合触摸屏实现模仿智能手表的表盘滚动效果,实际效果如下: 程序使用LVGL图形库和MediaManager程序,创建带有触摸…

使用Vue.js和WebSocket打造实时库存仪表盘

大家好!今天我将分享一个简单却强大的实时库存仪表盘项目,基于Vue.js和WebSocket技术。这个项目适合初学者学习前端实时数据处理,也能为你的技术博客或作品集增添亮点!通过这个教程,你将学会如何使用WebSocket实现实时…

leecode100——接雨水

题目 双指针 思路1 使用参数存储从左往右(从右往左同理)遍历时的最高的柱子, 然后移动左右的指针,每次移动左右指针中偏向小的, 如果当前指针指的柱子小于最高的柱子,就会存在接到水。 思路2 把水看作柱子&…

复古胶片风格街拍人像Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程复古胶片风格街拍人像 Lightroom 调色,通过模拟经典胶片相机的色彩科学,为现代数码照片注入怀旧韵味。这种调色手法注重低饱和度色彩、柔和的高光过渡和丰富的暗部细节,配合适度的颗粒感,营造出时光沉淀的质感。特别适合街…

Linux的gpio子系统

GPIO其实也是某个pin的功能之一。上一小节讲解了 pinctrl 子系统,pinctrl 子系统重点是设置 PIN(有的 SOC 叫做 PAD)的复用和电气属性,如果 pinctrl 子系统将一个 PIN 复用为 GPIO 的话,那么接下来就要用到 gpio 子系统了。gpio 子系统顾名思…

VC++ CPU指令集检测工具实现原理

📈 VC CPU指令集检测工具实现原理 例图:🧠 1. 核心原理:CPUID指令 // 使用CPUID指令获取CPU信息 int cpuInfo[4] { -1 }; __cpuid(cpuInfo, 0); // 调用CPUID指令 int nIds cpuInfo[0]; // 获取最大标准功能号CPUID指令工作流程…

大模型微调理论、实战:LLaMA-Factory、Unsloth

概述 微调,Fine-Tuning,简称FT,可理解为对LLM的定制,目的是增强专业领域知识,并优化特定任务的性能。通过在特定数据集上微调一个预训练模型,可实现: 更新知识:引入新的领域专属信…

【LCA 树上倍增】P9245 [蓝桥杯 2023 省 B] 景区导游|普及+

本文涉及知识点 树上倍增 P9245 [蓝桥杯 2023 省 B] 景区导游 题目描述 某景区一共有 NNN 个景点,编号 111 到 NNN。景点之间共有 N−1N-1N−1 条双向的摆渡车线路相连,形成一棵树状结构。在景点之间往返只能通过这些摆渡车进行,需要花费…

基于Python+Streamlit的旅游数据分析与预测系统:从数据可视化到机器学习预测的完整实现

🏞️ 基于PythonStreamlit的旅游数据分析与预测系统:从数据可视化到机器学习预测的完整实现 📝 前言 在大数据时代,旅游行业的数据分析变得越来越重要。如何从海量的旅游数据中挖掘有价值的信息,并进行准确的销量预测&…

飞算JavaAI全链路实战:智能构建高可用电商系统核心架构

飞算JavaAI全链路实战:智能构建高可用电商系统核心架构 前言:AI编程新时代的电商系统开发范式变革 在当今数字经济时代,电商系统作为企业数字化转型的核心载体,其复杂度和技术要求与日俱增。一个完整的电商系统不仅需要处理商品、…

论文精读(五):面向链接预测的知识图谱表示学习方法综述

笔者链接:扑克中的黑桃A 专栏链接:论文精读 本文关键词:知识图谱; 表示学习; 链接预测; 多元关系; 超关系 引 诸位技术同仁: 本系列将系统精读的方式,深入剖析计算机科学顶级期刊/会议论文,聚焦前沿突破…