MySQL中的回表

目录

1、表扫描和索引:

表扫描(Table Scan):

索引:

2、聚簇索引 vs. 非聚簇索引:

聚簇索引(Clustered Index):

非聚簇索引(Non-clustered Index):

选择索引类型的考虑:

3、回表:

回表的工作流程:

为什么发生回表:

回表的影响:

我的其他博客


"回表"是数据库查询中的一个概念,特别是在执行查询时涉及到非聚簇索引的情况下。让我们来详细解释一下:

1、表扫描和索引:

表扫描(Table Scan):

表扫描是指数据库系统对整个表进行逐行扫描以满足查询条件。当没有适用的索引可用或查询条件无法充分利用索引时,数据库引擎可能会选择执行表扫描。表扫描有两种类型:全表扫描和局部扫描。

  1. 全表扫描(Full Table Scan):

    • 概念: 在全表扫描中,数据库按顺序读取整个表的每一行,以找到满足查询条件的记录。
    • 应用场景: 当没有可用的索引,或者对整个表的数据进行操作时,可能会执行全表扫描。
  2. 局部扫描:

    • 概念: 局部扫描是在某些条件下扫描表的一部分,而不是整个表。
    • 应用场景: 当查询条件只涉及到表的一部分数据时,数据库引擎可能会执行局部扫描以提高性能。

索引:

索引是一种数据结构,用于提高数据库系统对表中数据的检索速度。索引可以看作是表的快速查找表,允许数据库引擎更迅速地定位和访问特定值。

  1. 聚簇索引(Clustered Index):

    • 概念: 表数据的物理顺序与索引的顺序一致。InnoDB 存储引擎的主键是聚簇索引。
    • 性能优势: 在聚簇索引上的查找速度很快,因为相邻的数据通常存储在相邻的磁盘页上。
  2. 非聚簇索引(Non-clustered Index):

    • 概念: 索引和表的数据存储在不同的地方。MySQL的InnoDB引擎的非主键索引就是非聚簇索引。
    • 性能考虑: 在非聚簇索引上的查找需要进行两次查找:首先在索引中找到主键,然后使用主键再到表中查找实际数据。
  3. 索引的作用:

    • 提高检索速度: 通过使用索引,数据库引擎可以快速定位到满足查询条件的数据,而不必扫描整个表。
    • 唯一性约束: 索引可以强制表中的某一列或一组列的唯一性,确保数据的一致性。
    • 加速排序和分组操作: 在排序或分组操作中,索引可以提高性能。
  4. 索引的选择和创建:

    • 根据查询模式选择: 索引的选择应该根据查询模式和频率进行,以优化常用查询的性能。
    • 权衡空间和性能: 索引会占用额外的磁盘空间,并在写操作时有一定的开销。在设计中需要权衡空间和性能。

在设计数据库时,合理使用索引,尽量减少表扫描,对于特定查询场景使用合适的索引,可以有效提高数据库的性能。

2、聚簇索引 vs. 非聚簇索引:

聚簇索引(Clustered Index):

  1. 概念:

    • 表数据的物理顺序与索引的顺序一致。换句话说,表的数据行的存储顺序与聚簇索引的顺序相同。
    • 在 InnoDB 存储引擎中,主键是聚簇索引。如果没有显式指定主键,InnoDB 会选择一个唯一非空索引来作为聚簇索引。
  2. 性能优势:

    • 查找速度很快,因为相邻的数据通常存储在相邻的磁盘页上,减少了 I/O 操作。
    • 范围查询和排序操作的性能较好,因为相关数据行在物理上是相邻的。
  3. 空间效率:

    • 由于表的数据行的物理顺序与聚簇索引的顺序相同,不需要额外的存储空间。

非聚簇索引(Non-clustered Index):

  1. 概念:

    • 索引和表的数据存储在不同的地方,它们的物理顺序不一定一致。在 InnoDB 中,非主键索引就是非聚簇索引。
    • 非聚簇索引中的叶子节点包含指向实际数据行的指针。
  2. 性能考虑:

    • 查找时需要进行两次查找:首先在索引中找到主键值,然后使用主键值再到表中查找实际数据。因此,相对于聚簇索引,查找性能可能较慢。
    • 范围查询和排序操作的性能可能较差,因为相关数据行在物理上可能不是相邻的。
  3. 空间效率:

    • 非聚簇索引需要额外的存储空间,因为索引和实际数据存储在不同的位置。

选择索引类型的考虑:

  1. 查询模式: 根据实际查询的模式来选择索引类型。如果经常使用范围查询、排序或者特定的列查询,聚簇索引可能更适合。

  2. 唯一性: 如果需要确保某一列或一组列的唯一性,可以选择在该列上创建唯一索引,这可能是一个聚簇索引或非聚簇索引。

  3. 表的写入操作: 聚簇索引在表的写入操作(插入、更新、删除)时可能产生较大的开销,因为数据的物理顺序需要维护。非聚簇索引相对于写入操作的开销可能较小。

  4. 表的大小: 聚簇索引对小表可能更为适用,而非聚簇索引可能更适合大表。

  5. 存储引擎支持: 不同的存储引擎对于聚簇索引和非聚簇索引的支持程度可能有所不同。在选择索引类型时需要考虑使用的存储引擎。

在设计数据库时,需要根据实际应用场景和性能需求来选择合适的索引类型。

3、回表:

"回表"是数据库查询优化中的一个概念,特别是在涉及非聚簇索引的情况下。当执行查询时,如果需要检索的数据不在索引中,数据库引擎就需要通过索引中的指针回到实际数据行所在的表中进行进一步的检索,这个过程就被称为“回表”。

回表的工作流程:

  1. 索引查找: 初始查询通过索引定位到符合条件的记录。这通常是通过 B 树等数据结构实现的,能够快速定位到索引键的值。

  2. 获取指针: 在非聚簇索引中,索引的叶子节点不直接包含数据,而是包含指向实际数据行的指针。数据库引擎需要获取这个指针。

  3. 回到表中检索实际数据: 使用获取的指针,数据库引擎回到表中,找到实际的数据行,获取查询所需的列的值。

为什么发生回表:

  1. 非聚簇索引的特点: 在非聚簇索引中,索引和实际数据存储在不同的位置。因此,当查询的列不在索引中时,就需要回到实际的数据行中获取这些列的值。

  2. 覆盖索引: 如果查询的列都包含在索引中,这样的索引被称为“覆盖索引”,就不会发生回表。覆盖索引可以减少回表的需求,提高查询性能。

回表的影响:

  1. 性能影响: 回表操作会增加额外的 I/O 操作和访问实际数据行的开销,可能导致查询性能下降。

  2. 优化策略: 为了减少回表的发生,可以考虑使用覆盖索引,即在索引中包含查询所需的所有列。

  3. 查询优化: 在设计数据库表结构和选择索引时,需要根据查询模式来优化,以最小化回表的次数。

总的来说,回表是在执行查询时需要注意的一个性能方面的考虑因素。合理设计表结构、选择适当的索引,以及考虑覆盖索引的使用,都是减少回表的发生,提高查询性能的重要策略。

我的其他博客

简单介绍一些其他的树-CSDN博客

认识二叉树(详细介绍)-CSDN博客

正则表达式详细讲解-CSDN博客

低代码开发:创新之道还是软件开发的捷径?-CSDN博客

HTTP与HTTTPS的区别-CSDN博客

什么情况下会产生StackOverflowError(栈溢出)和OutOfMemoryError(堆溢出)怎么排查-CSDN博客

在多线程中sleep()和wait()的区别(详细)-CSDN博客

谈谈我对HashMap扩容机制的理解及底层实现-CSDN博客

堆排序详细讲解(一文足矣JAVA)-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mybatis多表映射-分步查询

1、建库建表 create database mybatis-example; use mybatis-example; create table t_book (bid varchar(20) primary key,bname varchar(20),stuid varchar(20) ); insert into t_book values(b001,Java,s001); insert into t_book values(b002,Python,s002); insert into …

焦炭冶金工艺3D可视化仿真展示更直观、形象

冶金行业作为重要的工业领域,其岗位实践培训一直面临着诸多挑战,随着web3d开发和VR虚拟仿真技术的不断创新和应用,冶金3D虚拟仿真实践教学平台应运而生,为钢铁生产培训带来了崭新的变革。 冶金3D虚拟仿真实践教学平台采用了先进的…

节日问候:在 Metaverse 中一起庆祝节日!

冬季即将来临,节日的脚步也越来越近,是时候通过 The Sandbox 中的最新活动——“节日问候”来迎接节日气氛了!为期 43 天的庆祝活动从 12 月 11 日开始,到 1 月 22 日结束,将带领玩家穿越一个充满 60 种体验的冬季仙境…

QT中时间时区处理总结

最近项目中要做跨国设备时间校正功能,用到了时区时间,在此做一下记录。 目录 1.常见时区名 2.测试代码 3.运行效果 1.常见时区名 "Pacific/Midway": "中途岛 (UTC-11:00)", …

【NSX-T】搭建NSX-T环境 —— Lab 说明和准备工作

目录 Lab 说明VM列表IP地址规划使用192.168.1.0/24作为实验环境主IP网段使用192.168.2.0/24网段作为freenas存储网段NSX 网段 拓扑汇总vSphere 7vSphere 8 虚拟机部署顺序 准备工作 Lab 说明 VM列表 Y:表示已部署N:表示未部署 HostIPDomain NameOSServ…

清雪除冰,扫出“平安路” 开封市鼓楼区民政局社工组织开展除雪破冰志愿行动

近日,我市迎来大范围降雪天气,积雪融化、道路结冰、湿滑难行,造成居民群众出行不便和较大的交通安全隐患。为迅速清除积雪和道路结冰积水,保障辖区居民尤其是困境群体的出行安全,2023年12月11日下午,鼓楼区…

Kafka系列之:统计kafka集群Topic的分区数和副本数,批量增加topic副本数

Kafka系列之:统计kafka集群Topic的分区数和副本数,批量增加topic副本数 一、创建KafkaAdminClient二、获取kafka集群topic元信息三、获取每个topic的名称、分区数、副本数四、生成增加topic副本的json文件五、执行增加topic副本的命令六、确认topic增加副本是否成功一、创建K…

系列二十七、Apache Jmeter使用

一、安装 下载安装包>解压到指定目录>双击打开D:\Programs\apache-jmeter-5.5\bin\ApacheJmeter.jar即可。我分享的ApacheJmeter链接: 链接:https://pan.baidu.com/s/1VI7f3buIWZbQEeq2CRbwlg?pwdyyds 提取码:yyds 二、使用 2.1、添…

@CrossOrigin解决跨域不生效问题

参考文献 CrossOrigin注解没有生效,解决方案集合_crossorigin注解不起作用-CSDN博客

MacOS 12 开放指定端口 指定ip访问

MacOS 12 开放指定端口 指定ip访问 在 macOS 上开放一个端口,并指定只能特定的 IP 访问,你可以使用 macOS 内置的 pfctl(Packet Filter)工具来实现。 以下是一些基本的步骤: 1、 编辑 pf 配置文件: 打开 /…

(数据结构)单链表的定义

#include<stdio.h> typedef struct LNode {int data;struct LNode* next; }LNode,*LinkList; //LNode为结构体类型&#xff0c;LinkList为指向单链表的指针 //初始化一个空的单链表 void InitList(LinkList L) {L NULL; //空表&#xff0c;暂时没有任何节点 } //判断单…

mysql:在字符串类型的列上创建索引,建议指定索引前缀长度

https://dev.mysql.com/doc/refman/8.2/en/create-index.html#create-index-column-prefixes 在字符串类型的列上创建索引&#xff0c;建议指定索引前缀长度&#xff0c;而没有必要用整个列来创建索引。因为用前面的字符创建索引&#xff0c;查询时并不会比在整列上创建索引慢很…

Self-Distillation from the Last Mini-Batch for Consistency Regularization中文版

Self-Distillation from the Last Mini-Batch for Consistency Regularization 从上一个小批量自发蒸馏&#xff0c;实现一致性正则化 摘要 知识蒸馏&#xff08;Knowledge distillation&#xff0c;KD&#xff09;展示了强大的潜力&#xff0c;作为一种强有力的正则化策略&a…

手把手教WSL如何访问宿主机USB设备

目录 工具安装window安装usbipd工具WSL usbip安装 Setupwindow&#xff08;Version>4.0.0&#xff09;window&#xff08;Version<4.0.0&#xff09;WSL 卸载 自从windows推出的WSL功能&#xff0c;对广大的Linux和嵌入式开发者来说是巨大福利&#xff0c;基本可以媲美日…

【头歌系统数据库实验】实验10 SQL互联网业务查询-1

目录 第1关&#xff1a;查找购买个数超过20,重量小于50的商品&#xff0c;按照商品id升序排序 第2关&#xff1a;查询向follow表中user_id 1 的用户&#xff0c;推荐其关注的人喜欢的音乐 第3关&#xff1a;查询向follow表中user_id用户&#xff0c;推荐其关注的人喜欢的音…

MinGW编译Python至pyd踩坑整理

title: MinGW编译Python至pyd踩坑整理 tags: [Python,CC] categories: [开发记录,Python] date: 2023-12-12 13:48:20 description: sidebar: [‘toc’, ‘related’,‘recent’] 注意需要魔法 用scoop自动安装配置MinGw 需要魔法&#xff0c;不需要手动配置mingw scoop in…

WPF使用WebBrowser报脚本错误问题处理

前言 WPF使用WebBrowser报脚本错误问题处理,我们都知道WPF自带的WebBrowser都用的IE内核,但是在特殊的条件下我们还需要用到它,比如展示纯html简单的页面。再展示主流页面的时候比如用到Jquery高级库或者VUE等当前主流站点时经常就会报JS脚本错误,在Winform里面我们一句代…

(十六)Flask之蓝图

蓝图 Flask蓝图&#xff08;Blueprint&#xff09;是Flask框架中用于组织和管理路由、视图函数以及静态文件的一种机制。它提供了一种将应用程序拆分为更小、可重用组件的方式&#xff0c;使得项目结构更清晰&#xff0c;代码更易于维护。 使用Flask蓝图&#xff0c;可以将相…

mysql中NULL值

mysql中NULL值表示“没有值”&#xff0c;它跟空字符串""是不同的 例如&#xff0c;执行下面两个插入记录的语句&#xff1a; insert into test_table (description) values (null); insert into test_table (description) values ();执行以后&#xff0c;查看表的…

VBA_NZ系列工具NZ10:VBA压缩与解压工具

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…