当前位置: 首页 > news >正文

MySQL- 覆盖索引

覆盖索引(Covering Index)是 MySQL 中的一种优化技术,它能够显著提高查询性能。在使用覆盖索引的情况下,查询操作只需要访问索引即可获取所需的数据,而不必再访问表的实际数据行(即不需要回表)。这种优化可以减少 I/O 操作,提升查询效率。

1. 什么是覆盖索引?

覆盖索引是指一个索引包含了查询所需要的所有列的数据。换句话说,查询可以完全从索引中获取所需的数据,而不需要访问表中的实际行数据。这意味着查询只需要读取索引就可以返回结果,而不必进行额外的磁盘 I/O 来读取表数据。

覆盖索引的典型特征是:

  • 索引包含了 SELECT 子句中的所有列。
  • 索引包含了 WHERE 子句中的所有列。
  • 索引包含了 ORDER BY 子句中的所有列(如果有)。

2. 覆盖索引的工作原理

在没有覆盖索引的情况下,查询执行的过程通常如下:

  1. MySQL 使用索引查找满足查询条件的记录的主键值(或聚簇索引)。
  2. MySQL 使用主键值回表(即访问表数据)来读取查询所需的列。

在有覆盖索引的情况下,查询执行的过程可以简化为:

  1. MySQL 使用索引查找满足查询条件的记录,并直接从索引中获取所有查询所需的列。
  2. 由于索引已经覆盖了查询所需的所有数据,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_idsalary 列,而这些列都包含在 idx_dept_salary 索引中。因此,MySQL 可以利用这个覆盖索引来优化查询。

覆盖索引的工作原理:

  • MySQL 可以直接从 idx_dept_salary 索引中获取 department_idsalary 的值,而不必再去访问 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_namesalary 列,因此这个查询可以完全由索引覆盖。

总结

覆盖索引是一种强大的 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创建项目 在图形化界面创建项目根据要求填写项目相关信息选择手动配置勾选配置项目选择配置项目然后我们就搭建完成啦🥳,构建可能需要一点时间&#xff0…...

随机生成 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集中学习第二周学…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

大数据学习(132)-HIve数据分析

​​​​🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言&#x1f4…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...