MySQL 索引覆盖(Covering Index)

news/2024/11/28 22:55:57/文章来源:https://www.cnblogs.com/zhanchenjin/p/18575418

MySQL 索引覆盖(Covering Index) 是一种优化查询性能的技术,指的是查询所需的所有列的数据都能够从索引中获取,不需要再回表查询数据。

 

1. 索引覆盖的概念

  • 覆盖索引(Covering Index) 是一种索引,它包含了 SQL 查询中涉及的所有列(包括查询列和条件列),不需要额外访问数据表即可完成查询。
  • 当使用覆盖索引时,查询可以直接从索引结构中返回结果,而无需回表(即访问实际数据行)。

2. 索引覆盖的特点

  • 减少 I/O 操作
    • 索引存储在 MySQL 的 B+ 树结构中,查询时只需在索引中读取数据。
    • 无需访问数据表,降低磁盘 I/O,提高查询速度。
  • 避免回表查询
    • 如果索引无法覆盖查询列,MySQL 需要根据索引定位行后,再去数据表获取其他字段,增加一次回表操作。

3. 索引覆盖的触发条件

  1. 查询的字段必须被索引包含
    • 查询涉及的字段(SELECTWHEREGROUP BYORDER BY)都需要包含在同一个索引中。
  2. 存储引擎
    • 索引覆盖主要适用于 MySQL 的 InnoDB 存储引擎,因为 InnoDB 的二级索引存储了主键信息,能高效支持回表。

4. 示例

普通索引(非覆盖索引)

假设有一张表 users

 
CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(100), email VARCHAR(100), age INT, INDEX idx_name_email (name, email) );

如果执行如下查询:

 
SELECT name, email, age FROM users WHERE name = 'Alice';
  • 查询的字段 age 不在索引 idx_name_email 中。
  • MySQL 会使用索引 idx_name_email 定位到满足 name='Alice' 的行,但仍需回表获取 age列的值。

覆盖索引

如果查询改为:

 
SELECT name, email FROM users WHERE name = 'Alice';
  • 查询只涉及 idx_name_email 索引包含的列 nameemail
  • MySQL 无需回表,可以直接从索引返回结果。

5. 优化示例

需求

经常查询用户的 nameemail,并过滤条件为 age > 30

优化前

 
SELECT name, email FROM users WHERE age > 30;
  • 如果只为 age 单独创建索引,则无法覆盖查询,仍需回表读取 nameemail

优化后

 
CREATE INDEX idx_age_name_email ON users (age, name, email);
  • 创建联合索引 idx_age_name_email 后,查询可以直接从索引返回结果。

6. 覆盖索引的注意事项

  1. 索引选择性

    • 索引覆盖并不总是最优选择,如果索引的选择性差(即区分度低),性能可能不如全表扫描。
  2. 索引空间开销

    • 覆盖索引需要额外的存储空间。
    • 应避免为低频查询创建覆盖索引。
  3. 数据更新成本

    • 如果表中数据频繁更新,覆盖索引可能增加索引维护成本。

7. 总结

覆盖索引是一种通过避免回表查询、直接从索引中获取数据的优化方式。它能够大幅提升查询性能,但需要结合查询场景和表结构合理设计。通过分析慢查询日志和创建合理的联合索引,可以充分利用覆盖索引带来的性能提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/843135.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Padavan 使用VNT

openwrt ppoe拨号有问题,实在忍受不了,只能换回稳定的Padavan下载二进制vnt放至/etc/storage添加自启脚本/etc/storage/vnt-cli -s tcp://x.x.x.x:29872 -k passwd --use-channel relay -n R3P -o 192.168.123.0/24 -i 10.1.50.0/24,10.1.1.4 -i 10.2.110.0/24,10.1.1.223 …

【架构】统一认证中心的架构设计与实现(一)

一、背景二、认证授权概念2.1 认证2.2 授权三、一些名词四、常见的认证方案4.1 JWT4.2 OAuth2五、SSO协议5.1 OpenID Connect5.2 SAML 2.05.3 CAS六、RBAC一、背景 一般在一个公司内部可能有多个系统,比如OA,财务系统,CMS,ERP,营销系统,客服中心,项目管理系统,代码管理…

Listener内存马

概述 Listener是Java Web App中的一种事件监听机制,用于监听Web应用程序中产生的事件,例如,在ServletContext初始化完成后,会触发contextInitialized事件,实现了ServletContextListener接口的Listener就可以接收到事件通知,可以在内部做一些初始化工作,如加载配置文件,…

一种小资源情况下RDS数据实时同步StarRocks方案

使用一台4C8 G服务器轻松实现2个MySQL实例中通过负责分库分表规则之后的5000多张表的数据实时同步到StarRocks一、背景 目前需要将阿里云RDS数据库的数据同步到自建的StarRocks集群。之前使用DolphinScheduler通过定时调度Datax任务,将数据同步到StarRocks集群中,但是随着业务…

Elasticsearch常用查询及Kibana使用

Elasticsearch常用查询及Kibana使用 背景 搭建好Nginx => Filebeat => Logstash => Elasticsearch的日志获取通道后,通过jmeter配置产生10000条请求查看jmeter配置查看聚合报告Devtools工具进行查询查询reponseTime 90%,95%,99%分割线GET nginx-2024.11.28/_search…

Logstash安装及传输日志

Logstash安装及传输日志 Logstash安装按照官方文档安装启动logstash 方法1启动命令systemctl start logstash方法2 查看logstash启动配置先执行命令查看启动文件位置,可看出启动文件位置为/etc/systemd/system/logstash.servicesystemctl status logstash查看/etc/systemd/sys…

FileBeat安装及抽取Nginx日志

FileBeat安装及抽取Nginx日志 FileBeat安装按照官网指导安装,其他系统或版本可参考下载页面。此次测试FileBeat与nginx部署在同一台机器上。curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.25-linux-x86_64.tar.gz tar xzvf filebeat-7.17.…

jquery数字格式化分隔符插件

jquery-number-divider是一款jquery数字格式化分隔符插件。该数字格式化插件可以按指定格式对大数字进行分隔,可以指定分隔符,是一款简单实用的数字格式化插件。在线演示 下载 安装 可以通过bower来安装number-divider.js数字格式化插件。bower install number-divider …

MySQL底层概述—2.InnoDB磁盘结构

大纲 1.InnoDB磁盘结构 2.表空间(Tablespaces) 3.数据字典(Data Dictionary) 4.双写缓冲区(Double Write Buffer Files) 5.重做日志(redo log) 6.撤销日志(undo log) 7.二进制日志(binlog) 8.新版本结构演变1.InnoDB磁盘结构 (1)Tablespaces (2)Double Write Buffer (3)redo lo…

36. MySQL补充知识点

1. 视图 1.1 理论 [1] 什么是视图 视图是通过查询得到一张虚拟表,并保存下来,后续可以直接使用。 视图也是一张表。 在计算机科学中,视图(View)是一种虚拟表,其内容是一个或多个基本表的查询结果。 与基本表不同,视图不存储实际的数据,而是根据创建视图时的查询语句在…

车间工人违规行为智能识别方案

车间工人违规行为智能识别方案基于深度学习的视频分析系统,车间工人违规行为智能识别方案能够利用工业相机实时监测工人在生产线上的行为,系统不仅能够监测工人的操作行为,还能够监控整个生产流程。例如,它可以监测材料选择需要经过的环节数量,手动翻转的次数,以及上料动…

人员禁区闯入行为检测算法

人员禁区闯入行为检测算法通过现场监控相机捕捉监控区域内的实时图像,人员禁区闯入行为检测算法基于YOLOv7和CNN对图像进行分析,当检测到禁区闯入行为时,系统会立即触发告警。支持与第三方设备通信,发送开关量信号,以及将告警信息推送给后台值班人员。通过实时监控和快速响…