28_mysql数据库优化之覆盖索引与索引下推

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 每天进步亿点点
参考来源:

康师傅:https://www.bilibili.com/video/BV1iq4y1u7vj?p=147

爱编程的大李子:https://blog.csdn.net/LXYDSF/article/details/126606855

一、覆盖索引

一个索引包含了满足查询结果的数据就叫做覆盖索引。它包括在查询里的 SELECT、JOIN 和 WHERE 子句用到的所有列(即建索引的字段正好是覆盖查询条件中所涉及的字段)。

简单说就是, 索引列+主键 包含 SELECT 到 FROM 之间查询的列

举例一:

# 删除之前的索引
DROP INDEX idx_age_stuno ON student;

# 创建 age,NAME 两个字段的联合索引
CREATE INDEX idx_age_name ON student (age,NAME);

# 不等号查找 导致索引失效
EXPLAIN SELECT * FROM student WHERE age <> 20;

# 覆盖索引下,上面的语句 不等号没有使索引失效
EXPLAIN SELECT age,NAME FROM student WHERE age <> 20;
注意:前面我们提到如果使用上<>就不会使用上索引了 并不是绝对的。我们讲解的关于 索引失效以及索引优化都是根据效率来决定的。对于二级索引来说:查询时间 = 二级索引计算时间 + 回表查询时间,由于我们使用的是覆盖索引,回表查询时间 = 0,索引优化器考虑到这一点就使用上 二级索引了

举例二:

# LIKE 以 % 开头的模糊查询导致索引失效
EXPLAIN SELECT * FROM student WHERE NAME LIKE '%abc';

# 由于上面创建的索引 idx_age_name 中包含了,id, age, name 三个字段,所以下面使用上了索引
EXPLAIN SELECT id,age FROM student WHERE NAME LIKE '%abc';

覆盖索引的利弊

  • 好处1:避免Innodb表进行索引的二次查询(回表)

    对于 Innodb 来说,二级索引在叶子节点中所保存的是行的主键信息,如果是用二级索引查询数据,在查找到相应的键值后,还需通过主键进行二次查询才能获取我们真实所需要的数据。

    在覆盖索引中,二级索引的键值中可以获取所要的数据,避免了对主键的二次查询,减少了 IO 操作,提升了查询效率。

  • 好处2:可以把随机 IO 变成顺序 IO 加快查询效率

    由于覆盖索引是按键值的顺序存储的,对于 I/O 密集型的范围查找来说,对比随机从磁盘读取每一行的数据 I/O 要少的多,因此利用覆盖索引在访问时也可以把磁盘的随机读取的 I/O 转变成索引查找的顺序 I/O。

    由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。

  • 弊端

    索引字段的维护 总是有代价的。因此,在建立冗余索引来支持覆盖索引时就需要权衡考虑了。

使用 前缀索引就用不上覆盖索引对查询性能的优化了,前缀索引中的数据并不完整,需要回表查询完整的数据。这也是你在选择是否使用前缀索引时需要考虑的一个因素。

二、索引条件下推

Index Condition Pushdown(ICP) 是 MySQL 5.6 中新特性,是一种在存储引擎层使用索引过滤数据的一种优化方式。ICP 可以减少存储引擎访问基表(回表)的次数以及 MySQL 服务器访问存储引擎的次数

类似覆盖索引, 索引条件下推使得类似于 % 开头的模糊查询 索引不失效。索引中包含这个字段,但是没有使用到这个字段的索引(比如‘%a%’),却可以使用这个字段在索引中进行条件过滤,从而 减少回表的记录条数,这就是索引条件下推带来的性能优化。

ICP 的开启、关闭(默认开启)

默认情况下启用索引条件下推。可以通过设置系统变量 optimizer_switch 控制 index_condition_pushdown

#关闭索引下推
SET optimizer_switch='index_condition_pushdown=off';

#打开索引下推
SET optimizer_switch='index_condition_pushdown=on';

当使用索引条件下推时,EXPLAIN 语句输出结果中 Extra 列内容显示为 Using index condition

ICP 的使用条件

  1. 只能用于二级索引(secondary index)
  2. explain 显示的执行计划中 type 值(join 类型)为 range 、 ref 、 eq_ref 或者 ref_or_null 。
  3. 并非全部 where 条件都可以用 ICP 筛选,如果 where 条件的字段不在索引列中,还是要读取整表的记录到 server 端做 where 过滤。
  4. ICP 可以用于 MyISAM 和 InnnoDB 存储引擎
  5. MySQL 5.6 版本的不支持分区表的 ICP 功能,5.7 版本的开始支持。
  6. 当 SQL 使用覆盖索引时,不支持 ICP 优化方法。
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
175 9
|
16天前
|
SQL 存储 关系型数据库
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
79 22
 MySQL秘籍之索引与查询优化实战指南
|
1天前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
21 11
|
13天前
|
SQL 关系型数据库 MySQL
MySQL派生表合并优化的原理和实现
通过本文的详细介绍,希望能帮助您理解和实现MySQL中派生表合并优化,提高数据库查询性能。
51 16
|
14天前
|
SQL 关系型数据库 MySQL
MySQL派生表合并优化的原理和实现
通过本文的详细介绍,希望能帮助您理解和实现MySQL中派生表合并优化,提高数据库查询性能。
33 7
|
18天前
|
存储 关系型数据库 MySQL
MySQL中为什么要使用索引合并(Index Merge)?
通过这些内容的详细介绍和实际案例分析,希望能帮助您深入理解索引合并及其在MySQL中的
68 10
|
1天前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
|
1月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
69 11
|
1月前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
59 8
|
1月前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
102 5

热门文章

最新文章