MySQL回表查询

回表查询是 MySQL 数据库中一种常见的查询操作,主要出现在使用索引进行查询的场景中。以下是具体介绍:

  • 概念:当查询语句所需要的数据不能仅通过索引来获取,还需要从数据表中获取更多列的数据时,就会发生回表查询。MySQL 先通过索引找到满足条件的记录的主键值,然后再根据主键值回到数据表中查找其他列的数据。
  • 举例:假设有一个students表,包含idnameagescore等列,并且在name列上建立了索引。当执行查询语句SELECT id, age FROM students WHERE name = 'John'时,MySQL 会先在name索引中查找nameJohn的记录对应的id值,这是通过索引快速定位的过程。然后,由于查询结果还需要age列的数据,而age列不在name索引中,所以 MySQL 会根据找到的id值回到students表中查找对应的age值,这个从表中获取额外数据的过程就是回表查询。
  • 性能影响:一般来说,回表查询的性能相对复杂一些。如果索引覆盖了查询所需的所有列,那么查询可以直接在索引中完成,速度会很快。但当需要回表时,就需要额外的 I/O 操作来访问数据表,这可能会增加查询的时间。不过,如果索引设计合理,回表查询的次数相对较少,对性能的影响通常是可以接受的。优化回表查询的方法包括合理设计索引,尽量让索引覆盖更多的查询列,减少不必要的回表操作。

1. 创建表结构并添加索引

-- 创建 students 表
CREATE TABLE students (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),age INT,score DECIMAL(5, 2),gender CHAR(1),class VARCHAR(20)
);-- 在 name 列上创建索引
CREATE INDEX idx_name ON students(name);

这里创建了一个 students 表,包含 idnameagescoregender 和 class 等列,并在 name 列上建立了索引。

2. 插入示例数据

-- 插入示例数据
INSERT INTO students (name, age, score, gender, class)
VALUES
('John', 18, 85.5, 'M', 'Class A'),
('Alice', 17, 90.0, 'F', 'Class B'),
('John', 19, 78.2, 'M', 'Class C'),
('Bob', 18, 88.8, 'M', 'Class A');

插入了一些学生信息,其中有两个名为 John 的学生。

3. 执行回表查询

-- 执行回表查询
SELECT id, age, score 
FROM students 
WHERE name = 'John';
查询过程分析

  • 索引查找:MySQL 首先使用 idx_name 索引,在该索引中查找 name 为 John 的记录。由于索引中存储了 name 列的值以及对应的 id(索引关联主键),所以能快速定位到两条 name 为 John 的记录的 id
  • 回表操作:查询需要 age 和 score 列的数据,而这两列不在 idx_name 索引中。因此,MySQL 会根据之前从索引中获取的 id 值,回到 students 表中查找对应的 age 和 score 值,这就是回表查询过程。

4. 性能影响分析

  • 性能问题:如果 students 表的数据量非常大,且有很多 name 为 John 的记录,那么回表操作会变得频繁。每次回表都需要进行磁盘 I/O 操作,而磁盘 I/O 相对较慢,会显著增加查询时间。
  • 可接受情况:若表中 name 为 John 的记录较少,或者索引设计合理使得回表次数有限,那么对性能的影响通常是可以接受的。

5. 优化方案

为了减少回表查询,可以创建覆盖索引。

-- 创建覆盖索引
CREATE INDEX idx_name_age_score ON students(name, age, score);

再次执行查询:

SELECT id, age, score 
FROM students 
WHERE name = 'John';

此时,由于 idx_name_age_score 索引包含了查询所需的 nameage 和 score 列,MySQL 可以直接从该索引中获取所需数据,无需回表查询,从而提高查询性能。

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

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

相关文章

MySQL 8 设置允许远程连接(Windows环境)

🌟 MySQL 8 设置允许远程连接(Windows环境) 在开发和部署应用时,经常需要从远程主机连接到MySQL数据库。默认情况下,MySQL仅允许本地连接,因此需要进行一些配置才能允许远程访问。今天,我将详细…

Prosys OPC UA Gateway:实现 OPC Classic 与 OPC UA 无缝连接

在工业自动化的数字化转型中,设备与系统之间的高效通信至关重要。然而,许多企业仍依赖于基于 COM/DCOM 技术的 OPC 产品,这给与现代化的 OPC UA 架构的集成带来了挑战。 Prosys OPC UA Gateway 正是为解决这一问题而生,它作为一款…

欢乐力扣:基本计算器

文章目录 1、题目描述2、思路代码括号 1、题目描述 基本计算器。  给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。  注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。 2、思路 本人也不太会&#xff0c…

SVN学习笔记

svn:版本控制软件 解决:1.协作开发 2.远程开发 3.版本回退 服务端软件: VisualSVN http://www.visualsvn.com 客户端软件:Tortoisesvn http://tortoisesvn.net/downloads 1.checkout(检出) 第一查更新数据到本地, 2.update&#xf…

Mysql表的查询

一:创建一个新的数据库(companydb),并查看数据库。 二:使用该数据库,并创建表worker。 mysql> use companydb;mysql> CREATE TABLE worker(-> 部门号 INT(11) NOT NULL,-> 职工号 INT(11) NOT NULL,-> 工作时间 D…

[ISP] 人眼中的颜色

相机是如何记录颜色的,又是如何被显示器还原的? 相机通过记录RGB数值然后显示器显示RGB数值来实现颜色的记录和呈现。道理是这么个道理,但实际上各厂家生产的相机对光的响应各不相同,并且不同厂家显示器对三原色的显示也天差地别&…

Cursor插件市场打不开解决

问题现象: cursor搜索插件的时候提示错误,无法搜索安装插件 error while fetching extensions.failed to fetch 问题原因 cursor默认安装使用的并不是vs code的插件市场,国内网络有时候打不开 解决 修改插件市场地址并重启cursor 打开cur…

R 语言科研绘图 --- 密度图-汇总

在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…

安卓屏保调试

安卓屏保调试 - Wesley’s Blog 先看一下在设置点击屏保预览后的调用链(Android 14) #mermaid-svg-YQ66ef7zSvNutCCW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YQ66ef7zSvNutCCW .erro…

考研系列-408真题计算机网络篇(18-23)

写在前面 此文章是本人在备考过程中408真题计算机网络部分(2018年-2023年)的易错题及相应的知识点整理,后期复习也常常用到,对于知识提炼归纳理解起到了很大的作用,分享出来希望帮助到大家~ # 2018 1.停止-等待协议的…

堆排序:力扣215.数组中的第K个大元素

一、问题描述 在一个整数数组 nums 中,需要找出第 k 个最大的元素。这里要注意,我们要找的是数组排序后的第 k 个最大元素,而不是第 k 个不同的元素。例如,对于数组 [3,2,1,5,6,4],当 k 2 时,第 2 个最大…

Qt-ZMQ的使用补充(pub-sub)

之前写过一篇Qt使用ZMQ的博客Qt网络编程-ZMQ的使用,本文是其的补充部分。 Linux上编译使用 首先这次实在Linux上进行演示,下载zmq源码,安装cmake,使用cmake进行编译。下载之后解压: 输入命令: cd ..mkdi…

一款基于Python的从常规文档里提取图片的简单工具开发方案

一款基于Python的从常规文档里提取图片的简单工具开发方案 1. 环境准备 安装必需库 pip install python-docx PyMuPDF openpyxl beautifulsoup4 pillow pip install pdfplumber # PDF解析备用方案 pip install tk # Python自带,无需安装工具选择 开发环…

日志存储与分析

日志是系统运行的详细记录,包含各种事件发生的主体、时间、位置、内容等关键信息。出于运维可观测、网络安全监控及业务分析等多重需求,企业通常需要将分散的日志采集起来,进行集中存储、查询和分析,以进一步从日志数据里挖掘出有…

cyberstrikelab lab2

lab2 重生之我是渗透测试工程师,被公司派遣去测试某网络的安全性。你的目标是成功获取所有服务器的权限,以评估网络安全状况。 先扫一下 ​ ​ 192.168.10.10 ​ ​ 骑士cms 先找后台路径 http://192.168.10.10:808/index.php?madmin&cind…

1.5.2 掌握Scala内建控制结构 - 块表达式

Scala的块表达式使用{}包裹语句组,单行语句不加分号,多语句用分号隔开。块表达式的结果是最后一行语句的值,无需单独写return。若无执行结果,则返回Unit对象(类似Java的void)。例如,有返回值时&…

VSCode + CMake

参考文献: 如何用 GCC, CMake 和 Make 编译C/C代码Windows 上的 Linux 子系统:WSLWSL:桌面 UI 远程连接 RDP 配置 VScode 文章目录 CMake 配置VSCode 配置launch.jsontask.jsonc_cpp_properties.json CMake 配置 编写如下的 CmakeLists.t…

【软考-架构】7、系统配置与性能评价

✨资料&文章更新✨ GitHub地址:https://github.com/tyronczt/system_architect 文章目录 性能指标💯考试真题第一题第二题 性能评价方法💯考试真题第一题第二题 阿姆达尔解决方法考试真题 性能指标 对计算机评价的主要性能指标有&#x…

STC89C52单片机学习——第20节: [8-2]串口向电脑发送数据电脑通过串口控制LED

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.03.15 51单片机学习——第20节: [8-2]串口向电脑发送数据&电脑通过串口控制LED 前言…

java简单基础学习

目录 简单5位验证码快捷键的使用 评委打分5个评委 去掉一个最高分和一个最低分 取平均分 抢红包出现数组越界java​编辑 双色球系统--之蒟蒻学习 简单5位验证码快捷键的使用 题目意思做个验证码 //生成一个5位数的验证码 //前四位是字母,大小字母都可以 //最后一位要是数字…