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

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

康师傅: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 优化方法。
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5天前
|
数据库 索引
如何优化数据库索引?
【8月更文挑战第14天】如何优化数据库索引?
18 4
|
3天前
|
SQL 存储 关系型数据库
mysql加索引真的会锁表吗?揭秘背后的技术细节与规避策略
【8月更文挑战第16天】在数据库管理中,添加索引能大幅提升查询效率。MySQL执行此操作时的锁定行为常引起关注。文章详细解析MySQL中索引添加时的锁定机制及其原理。不同存储引擎及SQL语句影响锁定策略:MyISAM需全表锁定;InnoDB提供更灵活选项,如使用`ALTER TABLE... LOCK=NONE`可在加索引时允许读写访问,尽管可能延长索引构建时间。自MySQL 5.6起,在线DDL技术可进一步减少锁定时间,通过`ALGORITHM=INPLACE`和`LOCK=NONE`实现近乎无锁的表结构变更。合理配置这些选项有助于最小化对业务的影响并保持数据库高效运行。
11 4
|
3天前
|
SQL JavaScript 关系型数据库
Mysql索引不当引发死锁问题
本文通过真实案例解析了MySQL在高并发环境下出现死锁的问题。数据库表`t_award`包含多个索引,但在执行特定SQL语句时遭遇索引失效,导致更新操作变慢并引发死锁。分析发现,联合索引`(pool_id, identifier, status, is_redeemed)`因`identifier`允许为空值而导致索引部分失效。此外,`pool_id`上的普通索引产生的间隙锁在高并发下加剧了死锁风险。为解决此问题,文中提出了调整索引顺序至`(pool_id, status, is_redeemed, identifier)`等方案来优化索引使用,进而减轻死锁现象。
|
5天前
|
存储 SQL 缓存
优化数据库
【8月更文挑战第15天】优化数据库
9 1
|
5天前
|
缓存 NoSQL Redis
一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这篇文章是关于Java面试中可能会遇到的五个问题,包括MySQL索引类型及其对数据库性能的影响、Redis的RDB和AOF持久化机制、Redis的过期键删除策略、Redis的单线程模型为何高效,以及缓存雪崩、缓存穿透和缓存击穿的概念及其解决方案。
|
5天前
|
SQL 存储 数据库
OceanBase数据库优化
【8月更文挑战第14天】OceanBase数据库优化
9 2
|
6天前
|
数据库连接 数据库
实现加载驱动、得到数据库对象、关闭资源的代码复用,将代码提取到相应的工具包里边。优化程序
该博客文章展示了如何通过创建工具类`Connectiontools`实现数据库连接、语句执行以及资源关闭的代码复用,以优化程序并提高数据库操作的效率和安全性。
|
8天前
|
存储 缓存 运维
优化高并发环境下的数据库查询性能:实战经验与技巧
在高并发环境下,数据库性能往往成为系统瓶颈。本文将深入探讨在高并发场景下优化数据库查询性能的策略与实践,包括索引优化、查询优化、数据库架构设计以及缓存机制的应用。通过对具体案例的分析,读者将能够掌握提升数据库性能的关键技术,从而在面对大规模用户请求时提高系统的响应速度和稳定性。
|
1天前
|
存储 安全 数据库
数据库的索引都有哪些类型?如何选择?
【8月更文挑战第17天】数据库的索引都有哪些类型?如何选择?
6 0