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

Mysql 性能优化:覆盖索引

概述

覆盖索引(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.lryc.cn/news/517566.html

相关文章:

  • vulnhub靶场【DC系列】之7
  • iOS - 消息机制
  • Wireshark 学习笔记1
  • Oracle OCP考试常见问题之线上考试流程
  • 微信小程序之历史上的今天
  • 记一次k8s下容器启动失败,容器无日志问题排查
  • 【HarmonyOS】纯血鸿蒙真实项目开发---经验总结贴
  • kettle做增量同步,出现报错:Unrecognized VM option ‘MaxPermSize-256m‘
  • 网络安全、Web安全、渗透测试之笔经面经总结(三)
  • 计算机的错误计算(二百零五)
  • Vue3(一)
  • 【项目】修改远程仓库地址、报错jdk
  • 实训云上搭建集群
  • 豆包ai 生成动态tree 增、删、改以及上移下移 html+jquery
  • 【网络协议】IPv4 地址分配 - 第二部分
  • 攻防世界 bug
  • Flink如何设置合理的并行度
  • 小兔鲜儿:生鲜区域,最新专题
  • TypeScript语言的网络编程
  • 复合机器人助力手机壳cnc加工向自动化升级
  • 在 C# 中显示动画 GIF 并在运行时更改它们
  • 个人博客搭建(二)—Typora+PicGo+OSS
  • Cloudflare IP 优选工具:轻松找到最快的 CDN 节点
  • HTB:Ransom[WriteUP]
  • Eclipse配置Tomcat服务器(最全图文详解)
  • STM32烧写失败之Contents mismatch at: 0800005CH (Flash=FFH Required=29H) !
  • 用户界面的UML建模10
  • 电影动画shader解析与实现
  • 蓝桥杯 第十五届 研究生组 B题 召唤数学精灵
  • 在 Go 应用中 如何像 FastAPI 一样优雅地构建控制器