什么是 MySQL 回表?

什么是 MySQL 回表?

题目

什么是 MySQL 回表?

推荐解析

回表简介

1)索引结构:MySQL 使用 B+ 树索引结构来加速数据的查找。B+ 树是一种多叉树,它的叶子节点中存储了完整的数据行,而非叶子节点存储了索引的键值和指向下一级节点的指针。

2)索引查询:当执行一个查询语句时,MySQL 会首先根据查询条件从 B+ 树的根节点开始进行查找,逐层下降直到找到满足条件的叶子节点。如果查询条件匹配了索引的键值,则可以直接从叶子节点中获取到完整的数据行,无需回表。

3)回表现象:在某些情况下,索引无法提供查询所需的所有信息,这时就需要进行回表操作。例如,如果查询语句需要返回的字段不在索引中,或者查询条件需要使用到索引之外的字段,就会发生回表现象。

4)回表过程:当发生回表时,MySQL 会根据叶子节点中的主键值再次去数据表中查找对应的数据行,以获取到缺失的数据。这个过程会增加额外的 IO 消耗和网络传输时间,降低查询性能。

5)回表优化:为了减少回表对性能的影响,可以采取一些优化措施。例如,使用覆盖索引来包含查询语句所需的所有字段,避免回表操作;或者使用索引的聚簇特性,将相关的字段放在一起,减少回表次数。

怎么查看有没有发生回表?

方案:使用 EXPLAIN 分析查询计划: 使用 MySQL 的 EXPLAIN 命令可以查看查询语句的执行计划,包括是否存在回表操作。通过查询计划中的 type 列和 Extra 列来判断。如果 type 列的值为 ref,表示使用了索引进行查询;Extra 列中的 Using index 表示没有发生回表。

示例:

SELECT id, name FROM users WHERE age > 25;

如果 age 列上有索引,但 id 和 name 列不在索引中,那么执行查询时可能会发生回表。因此可以采用覆盖索引,将查询字段都添加到一个联合索引中。

回表经常出现的场景

1)需要查询的字段不在索引中:当查询语句需要返回的字段不在索引中时,就会发生回表。例如,如果索引只包含了用户的 ID,而查询语句需要返回用户的姓名和年龄,就需要进行回表操作。

2)使用了非索引字段进行查询:如果查询语句需要使用到索引之外的字段进行条件过滤,也会导致回表。例如,如果有一个索引是用户的 ID,但查询语句需要根据用户的姓名进行查询,就需要回表操作。

3)覆盖索引不可用:覆盖索引是指索引包含了查询语句需要返回的所有字段。如果覆盖索引不可用,即索引中不包含所有需要的字段,就会发生回表。这通常发生在查询需要返回大量字段或者字段类型较大的情况下。

4)查询结果需要排序或分组:如果查询语句需要对结果进行排序或分组操作,而排序或分组的字段不在索引中,也会导致回表。因为排序或分组需要对完整的数据行进行操作。

5)索引选择性低:索引选择性是指索引中不同键值的唯一性程度。如果索引选择性低,即索引中的键值重复较多,那么在进行索引查询时,可能会有多条数据落在同一个叶子节点上,这就需要进行回表操作。

解决回表小示例

-- 创建一个示例表
CREATE TABLE student (id INT PRIMARY KEY,name VARCHAR(50),age INT
);-- 插入一些示例数据
INSERT INTO student (id, name, age) VALUES
(1, 'Alice', 20),
(2, 'Bob', 21),
(3, 'Charlie', 22);-- 创建一个非聚簇索引
CREATE INDEX idx_name ON student (name);-- 查询示例,这里会发生回表
EXPLAIN SELECT * FROM student WHERE name = 'Alice';-- 创建一个覆盖索引
CREATE INDEX idx_name_age ON student (name, age);-- 再次执行查询,这次将使用索引覆盖
EXPLAIN SELECT name, age FROM student WHERE name = 'Alice';

注意事项

回表并不一定是性能问题的根本原因,有时候回表是无法避免的。但在一些特定场景下,可以通过优化查询语句、设计合适的索引或者调整数据库的配置来减少回表的次数,提升查询性能,避免回表并不是银弹!!!

其他补充

鱼聪明 AI 的回答:

鱼聪明 AI 地址:https://www.yucongming.com/

MySQL 中的"回表"是指在查询数据时,需要先通过索引定位到主键值,然后再通过主键定位到实际的行记录。这个过程通常需要扫描两次索引树,因此性能相对较低。

在 InnoDB 存储引擎中,有两大类索引:聚集索引(clustered index)和普通索引(secondary index)。聚集索引的叶子节点存储行记录,因此,InnoDB 必须要有,且只有一个聚集索引。普通索引的叶子节点存储主键值。这意味着,如果一个查询不是通过聚集索引进行的,那么就需要进行回表查询。

例如,假设我们有一个表user,其中id是主键,name是普通索引。如果我们执行查询SELECT * FROM user WHERE name='lisi',那么查询过程如下:

  1. 通过普通索引定位到主键值id=5
  2. 通过聚集索引定位到行记录。

这就是所谓的回表查询。

为了避免回表查询,我们可以使用覆盖索引。覆盖索引是指一个索引包含(或者说覆盖)所有需要查询的字段的值。如果一个查询可以通过覆盖索引完成,那么就不需要回表查询,从而提高查询性能。

知乎某同学:

回表现象可以通过索引覆盖来避免。索引覆盖是指在查询语句中使用的索引包含了查询所需的所有字段,从而无需回表到主键索引或数据页。例如,如果查询语句需要返回的字段不在索引中,或者查询条件需要使用到索引之外的字段,就会发生回表现象。为了避免回表,可以创建一个覆盖索引,包含了查询中涉及的所有字段。这样,查询就可以通过索引本身得到所需的数据,而不需要回表到主键索引或数据页。这可以提高查询性能并减少 IO 消耗。在实际应用中,可以通过优化索引、使用前缀索引、使用联合索引、选择合适的索引列顺序等方法来创建有效的索引,提高查询效率,从而避免回表现象的发生。

侠客网某同学:

MySQL 回表是一个数据库查询优化的概念,主要是针对数据表中所使用的索引并不能覆盖查询语句中所需要的所有字段而引发的问题。这时,MySQL 就需要回到数据表中重新查找需要的数据,这也就是回表的含义。

欢迎交流

在阅读本文之后你了解了什么是 MySQL 回表,回表会产生什么用哪个的影响,以及如何避免回表,这是面试中几乎是关于数据库的必问项,大家要准备充分!下面我留下三个问题,大家可以会回表有更深入的理解。

1.什么是聚簇索引和非聚簇索引?

2.为什么需要进行回表查询?

3.什么情况下使用覆盖索引可以提高查询的性能?

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

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

相关文章

深度学习pytorch——过拟合欠拟合测试深度学习模型(持续更新)

随着项数越来越多,函数的图形就更加复杂,多项式也更加的复杂。 课时55 过拟合与欠拟合_哔哩哔哩_bilibili 如果利用多项式建造复杂模型,从仅仅一个常数至一个多次方函数,将会发现在线上的点会变得越来越多,这种逐渐接…

【2024系统架构设计】案例分析- 3 数据库

目录 一 基础知识 二 真题 一 基础知识 1 ORM ORM(Object—Relationl Mapping

机器学习——聚类算法-KMeans聚类

机器学习——聚类算法-KMeans聚类 在机器学习中,聚类是一种无监督学习方法,用于将数据集中的样本划分为若干个簇,使得同一簇内的样本相似度高,不同簇之间的样本相似度低。KMeans聚类是一种常用的聚类算法之一,本文将介…

Rust 02.控制、引用、切片Slice

1.控制流 //rust通过所有权机制来管理内存,编译器在编译就会根据所有权规则对内存的使用进行 //堆和栈 //编译的时候数据的类型大小是固定的,就是分配在栈上的 //编译的时候数据类型大小不固定,就是分配堆上的 fn main() {let x: i32 1;{le…

aws使用记录

数据传输(S3) 安装命令行 安装awscli: https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html#getting-started-install-instructions 直到 aws configure list 可以运行 身份验证: 运行: aws config…

EdgeGallery开发指南

API接口 简介 EdgeGallery支持第三方业务系统通过北向接口网关调用EdgeGallery的业务接口。调用流程如下图所示(融合前端edgegallery-fe包含融合前端界面以及北向接口网关功能,通过浏览器访问时打开的是融合前端的界面,通过IP:Port/urlPref…

【力扣hot100】23 合并K个排序链表(c++)解析

23 合并K个排序链表(c)解析 题解 23 合并K个排序链表(c)解析1.1 暴力求解1.2 逐一比较1.3 优先队列1.4 逐一合并1.5 分治 在解决「合并K个排序链表」这个问题之前,我们先来看一个更简单的问题: 如何合并两个有序链表?…

libVLC 动态视频壁纸

在 Windows 上,你可能需要使用 Windows API 来设置壁纸,而在 Linux 上,你可能需要使用某种桌面环境特有的方法。在 macOS 上,这一功能可能受到限制。 效果图如下所示: 以下是一个简单的示例,说明了如何在 …

【前端学习——js篇】11.元素可见区域

具体见:https://github.com/febobo/web-interview 11.元素可见区域 ①offsetTop、scrollTop offsetTop,元素的上外边框至包含元素的上内边框之间的像素距离,其他offset属性如下图所示: 下面再来了解下clientWidth、clientHeight…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑长周期供需不平衡风险的新型电力系统规划方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

codesys通过moudbus TCP连接西门子1214c,西门子做客户端

思路在codesys中发送数据到西门子,西门子原封不动的将数据传回。 1.首先配置codesys; 我设置了500个,但是好像发不这么多,只能120多个。因为什么来我忘了。但是这里不影响。 2.配置映射: 3.写代码 PROGRAM PLC_PRG VARarySendDa…

生产调度问题分类——机器视角

获取更多资讯,赶快关注上面的公众号吧! 文章目录 单机调度并行机调度流水车间调度作业车间调度柔性作业车间开放车间总结 生产调度问题是实际工作中广泛存在的运筹学问题,可以描述为“给定若干加工任务,根据已有的生产条件&#…

JavaWeb学习笔记01

一、教程简介 全新JAVAWEB(里程碑版) 一套更适合后端工程师学习的WEB教程 All in Java 1、后端 ① Spring全家桶及微服务框架 ② 高性能数据库和消息组件 ③ Web攻击防护安全控制手段 ④ 其他第三方SDK生态环境 ...... 2、前端 ① 视图三大件&…

C是用什么语言写出来的?

C是用什么语言写出来的? C语言的起源和发展是一个迭代过程: 1. 最初的C语言编译器的开发始于对B语言的改进。B语言是由Ken Thompson设计的,它是基于BCPL语言简化而来的。在开始前我有一些资料,是我根据网友给的问题精心整理了一份「 C语言的…

Sublime 彻底解决中文乱码

1. 按ctrl,打开Console,输入如下代码: import urllib.request,os; pf Package Control.sublime-package; ipp sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHand…

16:00面试,16:06就出来了,问的问题有点变态。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…

07_Response

文章目录 案例(请求分发案例) Response响应行响应头响应体特殊响应头refreshContent-typeContent-dispositionlocation 案例(登录案例) 案例(请求分发案例) 场景:有多个请求 Http://localhost:…

逐步学习Go-并发通道chan(channel)

概述 Go的Routines并发模型是基于CSP,如果你看过七周七并发,那么你应该了解。 什么是CSP? "Communicating Sequential Processes"(CSP)这个词组的含义来自其英文直译以及在计算机科学中的使用环境。 CSP…

day 36 贪心算法 part05● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

一遍过。首先把区间按左端点排序,然后右端点有两种情况。 假设是a区间,b区间。。。这样排列的顺序,那么 假设a[1]>b[0],如果a[1]>b[1],就应该以b[1]为准,否则以a[1]为准。 class Solution { public:static bo…

Android中运动事件的处理

1.目录 目录 1.目录 2.前言 3.程序演示 4.第二种程序示例 5.扩展 2.前言 触摸屏(TouchScreen)和滚动球(TrackBall)是 Android 中除了键盘之外的主要输入设备。如果需要使用触摸屏和滚动球,主要可以通过使用运动事…