MySQL 回表 & 索引覆盖

2023-10-27

索引类型

聚簇索引: 叶子节点存储的是行记录,每个表必须要有至少一个聚簇索引。使用聚簇索引查询会很快,因为可以直接定位到行记录
普通索引:二级索引,除聚簇索引外的索引,即非聚簇索引。普通索引叶子节点存储的是主键(聚簇索引)的值。

聚簇索引递推规则:

  • 如果表设置了主键,则主键就是聚簇索引
  • 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索引
  • 以上都没有,则会默认创建一个隐藏的row_id作为聚簇索引

索引结构

id 是主键,所以是聚簇索引,其叶子节点存储的是对应行记录的数据
在这里插入图片描述非聚簇索引(Non-ClusteredIndex)
在这里插入图片描述## 聚簇索引查询
如果查询条件为主键(聚簇索引),则只需扫描一次B+树即可通过聚簇索引定位到要查找的行记录数据。
如:select * from user where id = 1;
在这里插入图片描述

非聚簇索引查询

如果查询条件为普通索引(非聚簇索引),需要扫描两次B+树,第一次扫描通过普通索引定位到聚簇索引的值,然后第二次扫描通过聚簇索引的值定位到要查找的行记录数据。
如:select * from user where age = 30;

1. 先通过普通索引 age=30 定位到主键值 id=1
2. 再通过聚集索引 id=1 定位到行记录数据

在这里插入图片描述先通过普通索引的值定位聚簇索引值,再通过聚簇索引的值定位行记录数据,需要扫描两次索引B+树,它的性能较扫一遍索引树更低。

索引覆盖

只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。
例如:select id,age from user where age = 10;
在这里插入图片描述使用id,age,name查询:

select id,age,name, salary from user where age = 10;
explain分析:age是普通索引,但name列不在索引树上,所以通过age索引在查询到id和age的值后,需要进行回表再查询name的值。此时的Extra列的Using where表示进行了回表查询
在这里插入图片描述Type: all, 表示全表扫描

增加表的联合索引:CREATE INDEX idx_user_name_age_salary ON mydb.user (name, age, salary);
explain分析:此时字段age和name是组合索引idx_age_name,查询的字段id、age、name的值刚刚都在索引树上,只需扫描一次组合索引B+树即可,这就是实现了索引覆盖,此时的Extra字段为Using index表示使用了索引覆盖。
在这里插入图片描述分页查询(非利用索引):
在这里插入图片描述
添加索引之后,即可实现利用索引快速查找。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 回表 & 索引覆盖 的相关文章

  • SQL DML:日期值不正确 (MySQL)

    我在数据库中创建了一个表 CREATE TABLE official receipt student no INT UNSIGNED academic year CHAR 8 trimester ENUM 1 2 3 or no MEDIU
  • 如何在 MySql Workbench 中禁用 INVISIBLE 索引选项?

    我刚刚安装了MySqlWorkbench我发现了实施INVISIBLE index所描述的here https dev mysql com doc refman 8 0 en invisible indexes html 我想禁用此功能 因
  • 为通用字符选择表排序规则

    我正在开发一个需要存储通用字符的后端 我选择了utf8mb4用于此目的的表编码 我还必须选择表格排序规则 最直接的选择是选择utf8mb4 general ci表整理 除了一般的排序规则之外 还有大约20种其他排序规则可供选择 更具体的排序
  • 严格标准:资源 ID#73 用作偏移量,转换为整数

    我使用这个 PHP 函数获取 MySql 结果 function fetcharray query id if query id query id this gt query res if query id this gt q array
  • 数据库不存在。确保名称输入正确

    为什么我会出现这个错误 如果您查看屏幕截图 您将看到数据库 仅当我连接到两个数据库引擎时才会发生这种情况 它仅检测下面数据库引擎中的数据库 而不检测突出显示的数据库 除了关闭应用程序并仅打开一个数据库引擎之外 还有其他方法可以使用我的数据库
  • 我可以让 MySQL 数据库在插入语句后自动为列分配值吗?

    给定一个具有 ID pk 和 name 列的员工表 ID name 1 John 2 James 3 Tom Can I do INSERT INTO employee name VALUES Jack 并以某种方式让数据库自动分配下一个可
  • 如何通过单个mysql查询更新多个表?

    我有两个表 tb1 和 tb2 我必须在用户级别更新两个表的公共列 我对两个表都有一个共同的标准 例如用户名 所以我想这样更新 UPDATE tb1 tb2 SET user level 1 WHERE username Mr X 但不知何
  • MySQL:更新所有行将字段设置为0,但将一行的字段设置为1

    是否有一种有效的方法将行字段的选择更新为 0 但根据 ID 将其中一行设置为 1 基本上 我在数据库中有多个对象 我想在其中一个 inuse 之间切换 因此查询将其中一行 按 id 设置为 inuse 1 将其他行设置为 inuse 0 谢
  • MySQL 连接不工作:2002 没有这样的文件或目录

    我正在尝试设置 WordPress 我已经运行了 Apache 和 MySQL 并且帐户和数据库都已设置 我尝试建立一个简单的连接 我总是得到这个 错误 2002 没有这样的文件或 目录 它正在谈论什么文件或目录 我使用的是 OS X Sn
  • 如何在MySQL选择查询中编写正则表达式?

    我尝试过这个表达 b word w b i比较一个word对照其他单词列表来查找重复项 我用了preg math all 效果很好 我想做同样的事情 但这次检查从 mysql 数据库检索到的单词 这是我写的 SELECT FROM tabl
  • 如何更改 Amazon Redshift 中的默认时区?

    默认情况下将时间戳列设置为 SYSDATE 将其存储为UTC 是否可以更改时区 以便 SYSDATE 将日期和时间存储到不同的时区 到目前为止 我已经检查了SET http docs aws amazon com redshift late
  • 使用 Python 开发时保护 MySQL 密码?

    我正在编写一个使用本地托管的 MySQL 数据库的 Python 脚本 该程序将以源代码形式提供 这样 MySQL 密码就肉眼可见 有没有好的办法来保护这个呢 这个想法是为了防止一些顽皮的人查看源代码 直接访问 MySQL 并做一些事情 好
  • 如何查询多对多表(一个表的值成为列标题)

    给定此表结构 我想展平多对多关系 并将一个表的名称字段中的值设置为列标题 并将同一表中的数量设置为列值 目前可行的想法是将值放入字典 哈希表 中并用代码表示这些数据 但我想知道是否有 SQL 方法可以做到这一点 我还使用 Linq to S
  • 安全转义表名/列名

    我在 php 中使用 PDO 因此无法使用准备好的语句转义表名或列名 以下是我自己实现它的万无一失的方法 tn str replace REQUEST tn column str replace REQUEST column sql SEL
  • 更新查询增量字段加上 1 codeigniter 函数 [重复]

    这个问题在这里已经有答案了 我想在 codeigniter 项目中将字段值增加到当前值加 1 所以 我做了一个功能 但它不起作用 我的职能是 function increse field by 1 table name fieldToInc
  • 使用mysql数据按高低价格排序

    这是我所拥有的以及我想做的 我的 MySql 数据库中有 12 个项目 4 个产品为 4 99 4 个产品为 3 99 4 个产品为 2 99 我意识到我可以像这样查询数据库 它会给我一个该价格的产品列表
  • 向 yahoo 和 hotmail 用户发送电子邮件?

    我正在使用 php 和 mysql 每次用户在我的网站上注册时 我都会使用 php mail 发送一封电子邮件进行身份验证 最近我发现 很多Yahoo和Hotmail用户还没有激活他们的帐户 假设 1000 个用户中 只有 200 个被激活
  • 无法将方法组“Read”转换为非委托类型“bool”

    我正在尝试使用SqlDataReader检查条目是否存在 如果存在则返回ID 否则返回false 当我尝试编译时 出现错误 无法将方法组 Read 转换为非委托类型 bool 我一直在遵循在 VB 中找到的示例 但似乎翻译可能不正确 pri
  • Mysql:计算访问频率

    我有这张桌子 CREATE OR REPLACE TABLE hits ip bigint page VARCHAR 256 agent VARCHAR 1000 date datetime 我想计算每个页面的 googlebot 访问频率
  • MySQL 查询获取每小时计数

    我需要统计每小时发生的操作次数 我的数据库按操作的时间戳保存日志 我明白我可以做一个 SELECT table time COUNT table time from table t group by t time 然而 也有一段时间没有采取

随机推荐

  • 史上最管用的C盘深度清理秘籍

    使用电脑的用户都知道 使用电脑一段时间后 会堆积很多无用的文件 不仅占用磁盘空间 而且导致系统运行速度变慢 所以清理c盘垃圾是非常有必要的 无论我们给C盘分多大的分区 Windows都有办法把它填满 像休眠文件 系统页面文件这都是动辄GB级
  • 反激式开关电源的原理是什么

    反激式开关电源是一种常见的电源转换器 其原理是将输入电压通过一个开关管进行高频开关 将电压转换为脉冲信号 再通过变压器进行隔离和变换 最终输出所需的电压 具体来说 当开关管导通时 输入电压经过变压器变换后 输出电压上升 并通过输出电容器进行
  • 轻量级的Python IDE —— Thonny

    现在的开发工具太多了 而且每个开发工具都致力于做成最好用最智能的工具 所以功能越堆越多 越怼越智能 安装这些开发工具比较烧脑 经常需要经过许多配置步骤 作为一个 Python 开发者来说 好多人光是这些配置都要弄半天 配置好之后 打开软件
  • [架构之路-178]-《软考-系统分析师》-17-嵌入式系统分析与设计- 3- 分区操作系统(Partition Operating System)概述

    目录 本文概述 1 1 什么是分区操作系统 1 2 分区操作系统出现背景 1 前后台系统 Foreground Background System 2 实时操作系统 RTOS 本文概述 随着嵌入式系统日趋复杂化以及对安全性要求的不断提高 采
  • “因为无法从捐赠中抽成,谷歌把我的开源 App 下架了!”

    众所周知 苹果税和谷歌税的存在 即 只要你的 App 在 App Store 或 Google Play 上架 产生的收入就必须分给苹果或谷歌 这个 收入 包括 收费 App 的下载费 游戏充值费 订阅服务费等 广泛的抽成范围加上 30 的
  • 解决Ubuntu无法安装pycairo和PyGObject

    环境 虚拟机Ubuntu20 04 vscode无法安装pycairo和PyGObject 虚拟机Ubuntu20 04 vscode中运行Anaconda搭建的vens 的Python3 8 10 首先在vscode中点击ctrl shi
  • Jupyter Notebook是什么及使用

    一 什么是Jupyter Notebook Jupyter项目是一个非盈利的开源项目 源于2014年的python项目 Juptter Notebook 原名IPython Notbook 是IPython的加强网页版 一个开源web应用程
  • 华为OD机试真题- 非严格递增连续数字序列-2023年OD统一考试(B卷)

    题目描述 输入一个字符串仅包含大小写字母和数字 求字符串中包含的最长的非严格递增连续数字序列的长度 比如12234属于非严格递增连续数字序列 输入描述 输入一个字符串仅包含大小写字母和数字 输入的字符串最大不超过255个字符 输出描述 最长
  • STM32学习——什么是寄存器(存储器映射和寄存器映射)

    目录 STM32芯片里面有什么 一 驱动单元 1 ICode总线 2 DCode总线 3 系统总线 4 DMA总线 二 被动单元 1 内部的闪存存储器 2 内部的SRAM 3 FSMC 4 AHB到APB的桥 三 STM32的外设基地址映射
  • CTEX中无限期试用WinEdt的方法

    CTeX中文套装是基于Windows下的MiKTeX系统 集成了编辑器WinEdt和PostScript处理软件Ghostscript和GSview等主要工具 虽说是非商业的免费软件 但其中的WinEdt其实是收费的软件 CTEX软件利用了
  • ffmpeg 录制屏幕

    文章目录 1 ffmpeg 下载 2 screen capture recorder 下载 3 ffmpeg 录屏命令 4 ffmpeg 其他命令 后续 寻路篇 立理想 坐豪车 住豪宅 天天睡到自然醒 叹现状 小黄车 挤隔断 早上起来数星星
  • 常用框架分析(7)-Flutter

    框架分析 7 Flutter 专栏介绍 Flutter 核心思想 Flutter的特点 快速开发 跨平台 高性能 美观的用户界面 Flutter的架构 框架层 引擎层 平台层 开发过程 使用Dart语言编写代码 编译成原生代码 热重载 工具
  • Dell服务器系统升级,更改引导方式(以戴尔R720为例)

    1 重启服务器按住F2 进入system setup 选择第一项的 system BIOS 2 选择 Boot Setting 进入后启动模式有两种 BIOS和UEFI 当磁盘小于2TB的时候选择BIOS 当磁盘大于2TB的时候选择UEFI
  • vue项目引入antDesignUI组件

    快速安装ant design vue并配置 vue2 0 antDesign 1 7 8 第一步 安装ant deisgn vue 1 7 8 npm install ant design vue 1 7 8 save 第二步 配置pack
  • Centos7下载和安装教程

    1 CentOS下载 CentOS是免费版 推荐在官网上直接下载 网址 https www centos org download DVD ISO 普通光盘完整安装版镜像 可离线安装到计算机硬盘上 包含大量的常用软件 一般选择这种镜像类型即
  • 如何用openweather显示html,如何显示openweathermap天气图标

    我正在使用openweathermap显示天气预报 一切正常 但图标有问题 json响应代码是 Array city gt Array id gt 1271476 name gt Guwahati coord gt Array lon gt
  • makefile中wildcard的理解

    wildcard 用来明确表示通配符 因为在 Makefile 里 变量实质上就是 C C 中的宏 也就是说 如果一个表达式如 objs o 则 objs 的值就是 o 而不是表示所有的 o 文件 若果要使用通配符 那么就要使用 wildc
  • PCB制板流程及工艺

    PCB制板的流程一般包括以下几个步骤 1 设计电路原理图和PCB布局 首先 需要设计电路原理图和PCB布局图 电路原理图是电路的逻辑图 用于指导电路的设计和调试 PCB布局图是电路板上各个元件的布局图 包括焊盘 引脚 电源 地线等 电路原理
  • 华中科技大学操作系统实验课 实验二

    一 实验目的 1 理解进程 线程的概念和应用编程过程 2 理解进程 线程的同步机制和应用编程 二 实验内容 1 在Linux下创建一对父子进程 2 在Linux下创建2个线程A和B 循环输出数据或字符串 3 在Windows下创建线程A和B
  • MySQL 回表 & 索引覆盖

    索引类型 聚簇索引 叶子节点存储的是行记录 每个表必须要有至少一个聚簇索引 使用聚簇索引查询会很快 因为可以直接定位到行记录 普通索引 二级索引 除聚簇索引外的索引 即非聚簇索引 普通索引叶子节点存储的是主键 聚簇索引 的值 聚簇索引递推规