什么是索引下推优化?

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 索引条件下推优化(ICP)是MySQL 5.6引入的查询优化技术。未使用ICP时,存储引擎通过索引检索数据返回给MySQL Server进行过滤;使用ICP后,MySQL Server将部分判断条件下推给存储引擎,减少不必要的回表查询和数据传输,从而提高查询性能。适用于range、ref等场景,支持InnoDB和MyISAM,但不支持子查询。默认开启,可通过`SET optimizer_switch = 'index_condition_pushdown=off';`关闭。

一:简介

索引条件下推优化(Index Condition Pushdown (ICP) )是 MySQL5.6 添加的,用于优化数据查询。

  • 不使用索引条件下推优化时存储引擎通过索引检索到数据,然后返回给 MySQL Server,MySQL Server 进行过滤条件的判断。
  • 当使用索引条件下推优化时,如果存在某些被索引的列的判断条件时,MySQL Server 将这一部分判断条件下推给存储引擎,然后由存储引擎通过判断索引是否符合 MySQL Server 传递的条件,只有当索引符合条件时才会将数据检索出来返回给 MySQL 服务器。

二:举例

首先,我们创建一张user表,同时建立age_name的联合索引,同时插入3条测试数据。

然后,我们执行查询:

sql

代码解读

复制代码

select * from t_user where name like '张%' and age=10;

按照我们上述的场景,实际上就存在两个索引树,一个是主键索引,存储了具体的数据的信息,另外则是age_name的联合索引,保存了主键的ID。

在没有ICP索引下推的时候,这个查询的流程应该是这样(略过无关的细节):

  1. Mysql Server层调用API查询存储引擎数据
  2. 存储引擎根据联合索引首先通过条件找到所有age>10的数据
  3. 找到的每一条数据都根据主键索引进行回表查询,直到找到不符合条件的结果
  4. 返回数据给Server层,Server根据条件对结果进行过滤,流程结束

而有了ICP之后的流程则是这样:

  1. Mysql Server层调用API查询存储引擎数据
  2. 存储引擎根据联合索引首先通过条件找到所有age>10的数据,根据联合索引中已经存在的name数据进行过滤,找到符合条件的数据
  3. 根据找到符合条件的数据,回表查询
  4. 返回数据给Server层,流程结束

三:总结

对比这两个流程就会很明显的发现,使用ICP之后我们就是简单的通过联合索引中本来就有的数据直接过滤了,不需要再查到一堆无用的数据去Server层进行过滤,这样的话减少了回表的次数和返回的数据,IO次数减少了,对性能有很好的提升。

索引条件下推优化可以减少存储引擎查询基础表的次数,也可以减少 MySQL 服务器从存储引擎接收数据的次数。

按照官方文档所说,ICP其实也存在一定的使用限制场景,只说关键的,乱七八糟的不说。

  1. 首先,ICP适用于range、ref、eq_ref和ref_or_null的场景下
  2. InnoDB和MyISAM都支持ICP,Mysql partition分表的话也可以使用
  3. 对于InndoDB而言,ICP只支持二级索引,因为主键索引它用不上不是吗?
  4. 子查询不支持

现在我们基本都使用的5.6以上的版本了,默认就是开启ICP的,想关闭的话可以通过命令SET optimizer_switch = 'index_condition_pushdown=off';


转载来源:https://juejin.cn/post/7180989069608878135

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
存储 算法 关系型数据库
第10章 索引优化与查询优化【2.索引及调优篇】【MySQL高级】3
第10章 索引优化与查询优化【2.索引及调优篇】【MySQL高级】3
416 0
|
分布式数据库 Hbase 存储
带你读《HBase原理与实践》之一:HBase概述
Apache HBase是基于Apache Hadoop构建的一个高可用、高性能、多版本的分布式NoSQL数据库,是Google BigTable的开源实现,通过在廉价服务器上搭建大规模结构化存储集群,提供海量数据高性能的随机读写能力。
|
NoSQL Redis 数据库
【Redis源码】轻松看懂rdb文件(四)
【Redis源码】轻松看懂rdb文件(四)
499 0
|
10月前
|
存储 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:高可用-无感切换篇
阿里云PolarDB云原生数据库在TPC-C基准测试中以20.55亿tpmC的成绩刷新世界纪录,单位成本仅0.8元人民币。PolarDB通过VotingDisk实现秒级故障切换,RPO=0,提供高可用性。PolarDB还推出国产轻量版,兼具高性能与低成本,满足多样化需求。
|
资源调度 运维 JavaScript
使用electron创建桌面应用及常见打包错误解决
使用electron创建桌面应用及常见打包错误解决
1707 3
|
机器学习/深度学习 人工智能 算法
「AI工程师」算法研发与优化-工作指导
**工作指导书摘要:** 设计与优化算法,提升性能效率;负责模型训练及测试,确保准确稳定;跟踪业界最新技术并应用;提供内部技术支持,解决使用问题。要求扎实的数学和机器学习基础,熟悉深度学习框架,具备良好编程及数据分析能力,注重团队协作。遵循代码、文档和测试规范,持续学习创新,优化算法以支持业务发展。
696 0
「AI工程师」算法研发与优化-工作指导
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 12 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
358 14
|
存储 SQL 关系型数据库
认真学习MySQL中的索引条件下推(ICP)
认真学习MySQL中的索引条件下推(ICP)
454 0
|
存储 Kubernetes 网络协议
在K8S中,Deployment和Statefulset有何区别?
在K8S中,Deployment和Statefulset有何区别?