Mysql 性能优化:覆盖索引

news/2025/1/13 4:41:35/

概述

覆盖索引(Covering Index)是一个 MySQL 查询优化技术,它指的是一个索引包含了查询所需的所有字段的数据,因此不需要回表(访问数据表的行)就可以完成查询。使用覆盖索引可以显著提高查询性能,因为它减少了磁盘 I/O 操作。

既然是索引,除了存储索引字段的数据之外,还存储了主键信息。

覆盖索引的使用条件 为查询的字段都在索引:查询涉及的所有字段(SELECT 列表、WHERE 子句和 ORDER BY 子句中的字段)必须包含在索引中。

覆盖索引使用示例

假设有一个表 users,结构如下:

CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(100),email VARCHAR(100),age INT,INDEX idx_name_age (name, age)
);
SELECT name, age,id FROM users WHERE name = 'John';

在这个查询中,idx_name_email_age 索引可以作为覆盖索引,因为:

  • 查询的字段 name 和 email 都包含在索引中。
  • WHERE 子句中的字段 name 也是索引的一部分。

因此,MySQL 可以仅通过访问 idx_name_email_age 索引来完成查询,而不需要访问 users 表的实际行数据。

问题:使用不等于/<>一定不走索引

索引时效的场景之一,就是 where 条件中使用了不等于符号,导致索引时效。
比如:

explain select * from users where name != 'xjjf';

通过执行计划我们可以看到,type 为 ALL,并没有走索引

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEusersALLidx_name_age1100Using where

但如果我们通过索引覆盖进行优化后,效果就不太一样了,通过执行计划我们可以看到,走了索引

explain select id,name,age from users where name != 'xjjf';
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEusersALLidx_name_age1100Using where

执行计划是以最低的成本来选择 sql 执行方式的,但查询的字段中包含非索引字段,意味着还需要进行一次回表,这样的成本可能还不如全表扫描性能更优,因此就不会走索引了,遇到 sql 性能问题,还是需要具体问题具体分析。

覆盖索引和联合索引有什么区别

看了使用覆盖索引进行查询优化后,可能会疑惑这不就是联合索引吗?其实不然。

  • 联合索引主要用于加速多列查询,而覆盖索引的目的是避免访问表数据(回表)。

  • 联合索引用于在单个索引中包含多个列,以提高查询效率。它是一个物理索引,存储在数据库中;覆盖索引是一个查询优化技术,指的是查询所需的所有数据都能从索引中获取,而无需访问表数据。

  • 覆盖索引是一种查询优化技术,而联合索引是一种索引结构。

  • 联合索引可以实现覆盖索引,但覆盖索引不一定是联合索引(覆盖索引可以是单列索引)。

结语

以上,祝你今天愉快!


http://www.ppmy.cn/news/1562707.html

相关文章

C++中 为什么要把基类指针指向子类对象?

为什么要把基类指针指向子类对象&#xff1f; 1&#xff09;实现多态性 动态绑定行为&#xff1a;通过基类指针指向子类对象&#xff0c;可以利用 C 的多态机制。当基类中有虚函数&#xff0c;并且子类重写了这些虚函数时&#xff0c;通过基类指针调用虚函数&#xff0c;实际调…

【算法】算法大纲

这篇文章介绍计算机算法的各个思维模式。 包括 计数原理、数组、树型结构、链表递归栈、查找排序、管窥算法、图论、贪心法和动态规划、以及概率论:概率分治和机器学习。没有办法逐个说明,算法本身错综复杂,不同的算法对应着不同的实用场景,也需要根据具体情况设计与调整。…

Lua语言的软件开发工具

Lua语言的软件开发工具 引言 Lua是一种轻量级且高效的脚本语言&#xff0c;广泛应用于游戏开发、嵌入式系统以及Web开发等领域。由于其简洁的语法、强大的扩展性和良好的性能&#xff0c;Lua逐渐成为开发者们青睐的语言之一。在Lua语言的生态系统中&#xff0c;各类软件开发工…

docker 安装 fastdfs

1、安装docker(已安装的跳过这一步) 2、安装FastDFS ## 这里我使用的腾讯云个人镜像 docker pull ccr.ccs.tencentyun.com/satan/fastdfs:6.06## 创建挂载映射文件夹 mkdir /data/fdfs/tracker /data/fdfs/storage## 安装tracker docker run -dti --networkhost --name track…

SkyWise Digital:助力国际品牌成功进军中国市场

伦敦,2025年1月8日 —— SkyWise Digital 天智数字营销正式成立,专注于为国际品牌提供定制化的市场进入策略和数字营销服务,帮助他们成功打入中国市场。作为一家集文化洞察、数据驱动与创新技术于一体的专业机构,SkyWise Digital 致力于帮助西方品牌解锁中国市场的巨大潜力。 …

Node.js入门html,css,js 30年了nodejs环境 09年出现 15年

Node.js入门 html,css,js 30年了 nodejs环境 09年出现 15年 nodejs为我们解决了2个方面的问题&#xff1a; 【锦上添花】让我们前端工程师拥有了后端开发能力&#xff08;开接口&#xff0c;访问数据库&#xff09; - 大公司BFF&#xff08;50&#xff09;【✔️】前端工程…

NLP中的问答(Question answering)

在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;问答&#xff08;Question Answering, QA&#xff09;任务并不严格等同于分类任务&#xff0c;但某些形式的QA任务可以被建模为分类问题。具体情况如下&#xff1a; 1. 问答任务的分类情况 多选问答 如果问题有多个备…

C++ vtordisp的应用场景

文章目录 问题代码1. 基本概念回顾2. 应用场景虚继承与虚函数并存的类层次结构 3. 编译器相关考虑 问题代码 #include <iostream> using namespace std;class base { public:base() {}virtual void show() { cout << "base:: show"<<endl; } priv…