MySQL- 覆盖索引
覆盖索引(Covering Index)是 MySQL 中的一种优化技术,它能够显著提高查询性能。在使用覆盖索引的情况下,查询操作只需要访问索引即可获取所需的数据,而不必再访问表的实际数据行(即不需要回表)。这种优化可以减少 I/O 操作,提升查询效率。
1. 什么是覆盖索引?
覆盖索引是指一个索引包含了查询所需要的所有列的数据。换句话说,查询可以完全从索引中获取所需的数据,而不需要访问表中的实际行数据。这意味着查询只需要读取索引就可以返回结果,而不必进行额外的磁盘 I/O 来读取表数据。
覆盖索引的典型特征是:
- 索引包含了 SELECT 子句中的所有列。
- 索引包含了 WHERE 子句中的所有列。
- 索引包含了 ORDER BY 子句中的所有列(如果有)。
2. 覆盖索引的工作原理
在没有覆盖索引的情况下,查询执行的过程通常如下:
- MySQL 使用索引查找满足查询条件的记录的主键值(或聚簇索引)。
- MySQL 使用主键值回表(即访问表数据)来读取查询所需的列。
在有覆盖索引的情况下,查询执行的过程可以简化为:
- MySQL 使用索引查找满足查询条件的记录,并直接从索引中获取所有查询所需的列。
- 由于索引已经覆盖了查询所需的所有数据,MySQL 不需要回表读取数据。
3. 覆盖索引的示例
假设我们有一个表 employees
,结构如下:
CREATE TABLE employees (emp_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department_id INT,salary DECIMAL(10, 2),INDEX idx_dept_salary(department_id, salary)
);
现在我们执行以下查询:
SELECT department_id, salary FROM employees WHERE department_id = 5;
在这个查询中,SELECT
子句只涉及 department_id
和 salary
列,而这些列都包含在 idx_dept_salary
索引中。因此,MySQL 可以利用这个覆盖索引来优化查询。
覆盖索引的工作原理:
- MySQL 可以直接从
idx_dept_salary
索引中获取department_id
和salary
的值,而不必再去访问employees
表的数据行。 - 因为查询所需的所有数据都可以从索引中获得,所以减少了不必要的磁盘 I/O 操作,显著提高了查询性能。
4. 覆盖索引的优点
- 减少 I/O 操作:覆盖索引允许查询只读取索引,而不必回表读取实际数据行。这减少了磁盘 I/O 操作,从而提高了查询性能。
- 提高查询速度:由于查询的数据可以直接从索引中获取,覆盖索引可以显著减少查询的响应时间,特别是在数据量较大的情况下。
- 减少锁竞争:由于减少了回表操作,覆盖索引也可以减少表上的行级锁定,降低锁竞争的概率。
5. 覆盖索引的局限性
- 索引大小的限制:为了让索引覆盖查询,索引必须包含查询所需的所有列。这可能导致索引变得非常大,从而增加了维护索引的开销(如插入、更新、删除操作的成本)。
- 冗余数据:在索引中包含所有查询列可能会导致数据冗余,特别是当表中有许多列且查询涉及的列较多时,创建覆盖索引可能会导致索引的存储空间显著增加。
- 适用场景有限:覆盖索引对那些查询列较少且频繁执行的查询最有效。如果查询涉及的列较多,或者查询模式变化频繁,覆盖索引的作用可能会减弱。
6. 何时使用覆盖索引?
覆盖索引特别适用于以下场景:
- 频繁查询特定列:如果应用程序经常查询某些列,而这些列可以通过索引覆盖,可以考虑创建覆盖索引。
- 优化读性能:在只读或读操作远多于写操作的场景中,覆盖索引可以显著提高查询性能。
- 减少回表操作:对于那些数据量大、需要频繁读取的表,覆盖索引可以减少回表操作,降低 I/O 开销。
7. 查看是否使用了覆盖索引
我们可以通过 EXPLAIN
关键字来查看 MySQL 是否使用了覆盖索引来执行查询。在 EXPLAIN
输出中,如果 Extra
列包含 Using index
,则表示查询使用了覆盖索引。
EXPLAIN SELECT department_id, salary FROM employees WHERE department_id = 5;
如果 Extra
列中显示 Using index
,说明 MySQL 只使用索引就完成了查询,无需回表操作,这就是覆盖索引在发挥作用。
8. 结合 InnoDB 的覆盖索引
在 InnoDB 存储引擎中,聚簇索引(主键索引)会包含表的所有列。因此,InnoDB 的二级索引自动包含主键列,这在某些情况下会对覆盖索引的设计产生影响。
假设有如下表结构:
CREATE TABLE employees (emp_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department_id INT,salary DECIMAL(10, 2),INDEX idx_lastname_salary(last_name, salary)
);
查询:
SELECT last_name, salary FROM employees WHERE last_name = 'Smith';
idx_lastname_salary
索引已经覆盖了 last_name
和 salary
列,因此这个查询可以完全由索引覆盖。
总结
覆盖索引是一种强大的 MySQL 查询优化技术,可以显著减少查询的 I/O 操作并提高性能。通过将查询所需的列全部包含在索引中,MySQL 可以避免回表操作,直接从索引中获取数据。然而,在使用覆盖索引时需要平衡索引的大小和性能收益,以确保索引能够有效地服务于实际的查询需求。
相关文章:
MySQL- 覆盖索引
覆盖索引(Covering Index)是 MySQL 中的一种优化技术,它能够显著提高查询性能。在使用覆盖索引的情况下,查询操作只需要访问索引即可获取所需的数据,而不必再访问表的实际数据行(即不需要回表)。…...

JSON与EXL文件互转
功能:实现json到excel文件的相互转换(支持json多选版) 目的:编码与语言对应,方便大家使用 页面设计: 介绍: 1.选择文件栏目选择想要转换的文件 2.生成路径是转换后文件所在目录 3.小方框勾选与不勾选分别代表exl到…...

后台管理权限自定义按钮指令v-hasPermi
第一步:在src下面建立一个自定义指令文件,放自定义指令方法 permission.js文件: /*** v-hasPermi 操作权限处理*/import store from "/store";export default {inserted(el, binding) {const { value } binding;//从仓库里面获取到后台给的数组const permission s…...
【Python绘制散点图并添加趋势线和公式以及相关系数和RMSE】
在Python中,绘制散点图并添加趋势线(通常是线性回归线)、公式、以及相关系数(Pearson Correlation Coefficient)和均方根误差(RMSE)可以通过结合matplotlib用于绘图,numpy用于数学运…...
linux bridge VLAN
TP-Link 支持 Linux 桥接(bridge)和 VLAN 功能的产品主要包括其高端的交换机和一些企业级路由器: TP-Link JetStream 系列交换机: TL-SG3424: 24端口千兆交换机,支持 VLAN 和桥接。TL-SG3210: 24端口千兆管理型交换机&…...
Java进阶篇之深入理解多态的概念与应用
引言 在Java面向对象编程(OOP)中,多态(Polymorphism)是一个关键概念,它允许相同类型的对象在不同的场景中表现出不同的行为。多态不仅增强了代码的灵活性和可扩展性,还极大地提高了代码的可维护…...
Linux下的进程调度队列
我们在进程那一篇讲到了操作系统时间片轮换调度的概念 那么Linux下具体是怎么调度的?...

统计回归与Matlab软件实现上(一元多元线性回归模型)
引言 关于数学建模的基本方法 机理驱动 由于客观事物内部规律的复杂及人们认识程度的限制,无法得到内在因果关系,建立合乎机理规律的数学模型数据驱动 直接从数据出发,找到隐含在数据背后的最佳模型,是数学模型建立的另一大思路…...

【项目】基于Vue3.2+ElementUI Plus+Vite 通用后台管理系统
构建项目 环境配置 全局安装vue脚手架 npm install -g vue/cli-init打开脚手架图形化界面 vue ui创建项目 在图形化界面创建项目根据要求填写项目相关信息选择手动配置勾选配置项目选择配置项目然后我们就搭建完成啦🥳,构建可能需要一点时间࿰…...
随机生成 UUID
1、随机生成 UUID主方法 /*** 随机生成 UUID* param {*} len 生成字符串的长度* param {*} radix 生成随机字符串的长度**/export function uuid_(len 30, radix 20) {var chars 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.split()var uuid [],ir…...

报名表EXCEL图片批量下载源码-CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构
每次报名表都会包含大量照片,一张一张下载很慢 可以通过未来之窗开源平台架构 开开excel批量下载 实现代码也很简单 function 未来之窗下载(){ let 未来之窗地址 document.getElementById("batchurl").value; let 保存路径 document.getElementById(…...

SpringBoot 整合 Elasticsearch 实现商品搜索
一、Spring Data Elasticsearch Spring Data Elasticsearch 简介 Spring Data Elasticsearch是Spring提供的一种以Spring Data风格来操作数据存储的方式,它可以避免编写大量的样板代码。 常用注解 常用注解说明如下: 注解名称 作用 参数说明 Docu…...

计算机毕业设计 助农产品采购平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

Django后台数据获取展示
续接Django REST Framework,使用Vite构建Vue3的前端项目 1.跨域获取后台接口并展示 安装Axios npm install axios --save 前端查看后端所有定义的接口 // 访问后端定义的可视化Api接口文档 http://ip:8000/docs/ // 定义的学生类信息 http://ip:8000/api/v1…...
innodb 如何保证数据的一致性?
InnoDB是MySQL的默认存储引擎之一,它通过多种机制来保证数据的一致性。以下是InnoDB保证数据一致性的主要方式: 1. 事务支持 InnoDB实现了ACID(原子性、一致性、隔离性和持久性)事务模型,这是保证数据一致性的基础。…...
Oracle-OracleConnection
提示:OracleConnection 主要负责与Oracle数据库的交互,特别针对CDC功能,提供了获取和处理数据库更改日志的能力,同时包含数据库连接管理、查询执行和结果处理的通用功能,与DB2Connection作用相似 文章目录 前言一、核心…...

基于hadoop的网络流量分析系统的研究与应用
目录 摘要 1 Abstract 2 第1章 绪论 3 1.1 研究背景 3 1.2 研究目的和意义 4 1.2.1 研究目的 4 1.2.2 研究意义 6 1.3 国内外研究现状分析 7 1.3.1 国内研究现状 7 1.3.2 国外研究现状 9 1.4 研究内容 11 第2章 Hadoop技术及相关组件介绍 12 2.1 HDFS的工作原理及…...

【C# WPF WeChat UI 简单布局】
创建WPF项目 VS创建一个C#的WPF应用程序: 创建完成后项目目录下会有一个MainWindow.xaml文件以及MainWindow.cs文件,此处将MainWindow.xaml文件作为主页面的布局文件,也即为页面的主题布局都在该文件进行。 布局和数据 主体布局 Wechat的布局可暂时分为三列, 第一列为菜…...
关于docker的几个概念(二)
目录 1. 为何Docker CentOS镜像比传统CentOS镜像小得多?2. 镜像的分层结构及其优势3. 讲一下容器的copy-on-write特性,修改容器里面的内容会修改镜像吗?4. 简单描述一下Dockerfile的整个构建镜像过程 1. 为何Docker CentOS镜像比传统CentOS镜…...
JAVA集中学习第五周学习记录(一)
系列文章目录 第一章 JAVA集中学习第一周学习记录(一) 第二章 JAVA集中学习第一周项目实践 第三章 JAVA集中学习第一周学习记录(二) 第四章 JAVA集中学习第一周课后习题 第五章 JAVA集中学习第二周学习记录(一) 第六章 JAVA集中学习第二周项目实践 第七章 JAVA集中学习第二周学…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...