首页 > 数据库 >MySQL 索引覆盖(Covering Index)

MySQL 索引覆盖(Covering Index)

时间:2024-11-28 23:00:10浏览次数:9  
标签:Index name 覆盖 Covering age 查询 索引 MySQL email

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. 总结

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

标签:Index,name,覆盖,Covering,age,查询,索引,MySQL,email
From: https://www.cnblogs.com/zhanchenjin/p/18575418

相关文章

  • 基于Java+SpringBoot+Mysql实现的点卡各种卡寄售平台功能设计与实现一
    一、前言介绍:1.1项目摘要随着电子商务和在线支付技术的快速发展,数字商品和虚拟货币的交易需求日益增长。点卡及各种卡类商品(如游戏点卡、话费充值卡、礼品卡等)作为数字商品的一种,因其便捷性和即时性,在市场中占据了重要地位。然而,传统的点卡销售方式往往存在渠道单一、交易效率......
  • 基于Java+SpringBoot+Mysql实现的点卡各种卡寄售平台功能设计与实现二
    一、前言介绍:1.1项目摘要随着电子商务和在线支付技术的快速发展,数字商品和虚拟货币的交易需求日益增长。点卡及各种卡类商品(如游戏点卡、话费充值卡、礼品卡等)作为数字商品的一种,因其便捷性和即时性,在市场中占据了重要地位。然而,传统的点卡销售方式往往存在渠道单一、交易效率......
  • MYSQL库的操作(如果想知道MYSQL中有关库的操作的知识,那么只看这一篇就足够了!)
        前言:在日常数据库管理中,熟练掌握MySQL的基本操作尤为重要。本文将详细介绍MySQL数据库的创建、查看、修改和删除操作。✨✨✨这里是秋刀鱼不做梦的BLOG✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客在正式开始讲解之前,先让我们看一下本......
  • 二进制安装MySQL8
    二进制安装MySQL81.创建用户组[root@localhost~]#groupadd-g27mysql&&useradd-g27-u27-M-s/sbin/nologinmysql#创建了一个名为mysql的用户和组,分别赋予了它们特定的ID(UID和GID为27),并设置了用户不能直接登录系统,确保MySQL服务在一个具有特定权限和限制的......
  • MySQL执行计划explain
    ......
  • mysql表
    创建users表(用户信息表)假设我们要记录用户的基本信息,如用户ID、姓名、电子邮件、联系电话、注册日期等。sql--在数据库'weather'中创建一个名为'users'的表USEweather;CREATETABLEusers(idINTAUTO_INCREMENTPRIMARYKEY,--用户ID,主键,自增fir......
  • mysql函数
    #字符串函数#拼接两个字符串concat(字符串1,字符串2)selectconcat('123','456');#123456#字符串中所有字符转小写lower(字符串)selectlower('Hello');#hello#字符串中所有字符转大写upper(字符串)selectupper('Hello');#HELLO#字符串向左侧补充长......
  • Access数据库与Mysql数据库的直观对比
    MicrosoftAccess和MySQL都是关系型数据库管理系统,但它们的设计目的、应用场景、功能特性和技术架构等方面存在显著差异。以下是两者的对比:1.目标与应用场景特性/数据库MicrosoftAccessMySQL类型桌面型数据库管理系统(RDBMS)开源的关系型数据库管理系统(RDBMS)主......
  • MySQL Workbench 数据库建模详解:从设计到实践
    目录数据库建模基础概念MySQLWorkbench简介与安装什么是MySQLWorkbench?安装与环境配置MySQLWorkbench数据库建模功能详解EER图(实体关系图)数据库反向工程数据库正向工程模型同步与版本管理MySQLWorkbench数据库建模实战教程创建新模型定义表结构设置关系与约......
  • IndexedDB
    IndexedDB简介MDN官网是这样解释IndexedDB的:IndexedDB是一种底层API,用于在客户端存储大量的结构化数据(也包括文件/二进制大型对象(blobs))。该API使用索引实现对数据的高性能搜索。虽然WebStorage在存储较少量的数据很有用,但对于存储更大量的结构化数据来说力不从心。而I......