当前位置: 首页 > news >正文

MySQL——索引下推

1、使用前后对比

index Condition Pushdown(ICP)是MySQL5.6中新特性,是一种在存储引擎层使用索引过滤数据的优化方式。

  • 如果没有ICP,存储引擎会遍历索引以定位基表中的行,并将它们返回给MySQL服务器,由MySQL服务器评估WHERE后面的条件是否保留行。
  • 启用ICP后(默认启用),如果部分WHERE条件可以仅使用索引中的列进行筛选,则MySQL服务器会把这部分WHERE条件放到存储引擎筛选。然后,存储引擎通过使用索引条目来筛选数据,并且只有在满足这一条件时才从表中读取行。
    • 好处:ICP可以减少存储引擎必须访问基表的次数和MySQL服务器必须访问存储引擎的次数。但是,ICP的加速效果取决于在存储引擎内通过ICP筛选掉的数据的比例。

例如以下语句

EXPLAIN SELECT * FROM `s1` WHERE key1 = 'vLuQVg' and key1 like '%v'

在这里插入图片描述

其中的key1 = 'vLuQVg’可以使用到索引,但是key1 like ‘%v’ 却无法使用到索引,在以前版本中的MySQL中,是按照下边步骤来执行这个查询的:

  • 先根据key1 = 'vLuQVg’这个条件。从二级索引index_key1中获取到对应的二级索引记录。
  • 根据上一步骤得到的二次索引记录中的主键进行回表,找到完整的用户记录在检测记录是否符合**key1 like ‘%v’**这个条件,将符合条件的记录加入最后的结果集。

但是虽然key1 like ‘%v’ 不能组成范围区间参与range访问方法的执行,但这个条件毕竟只涉及到了key1列,所以MySQL把上边的步骤改进了一下:

  • 先根据key1 = 'vLuQVg’这个条件,定位到二级索引index_key1中对应的二级索引记录。
  • 对于指定的二级索引记录,先不着急回表,而是先检测一下该记录是否满足key1 like ‘%v’ 这个条件,如果这个条件不满足,则该二级索引记录压根就没必要回表操作。
  • 对于满足key1 like ‘%v’ 这个条件的二级索引记录进行回表操作。

我们说回表操作其实是一个随机IO,比较耗时,所以上述修改虽然只改进一点点,但是可以省去好多回表操作的成本。MySQL把它们的这个改进称之为索引条件下推(英文名:Index Condition Pushdown)。

2、ICP的使用条件

  1. 如果表访问的类型为range、ref、eq_ref和ref_or_null可以使用ICP
  2. ICP可以用于Innodb和MyISAM表,包括分区表Innodb和MyISAM表
  3. 对于Innodb表,ICP仅用于二级索引。ICP的目标是减少全行读取次数,从而减少I/O操作
  4. 当SQL使用覆盖索引时,不支持ICP,因为这种情况使用ICP不会减少I/O
  5. 相关子查询的条件不能使用ICP

相关文章:

  • Mysql基础-多表查询
  • 280 基于matlab的摇号系统GUI界面仿真MATLAB程序
  • Rust-10-数据类型
  • 文心一言使用技巧
  • 计算机网络:数据链路层 - 扩展的以太网
  • uni-app uni-swipe-action 滑动操作状态恢复
  • 智能合约中外部调用漏洞
  • 使用 Java 操作 Redis 数据类型的详解指南
  • Python怎么调用JAR包:揭秘跨语言交互的奥秘
  • QT4-QT5升级(3)GBK-UTF-8-乱码“常量中有换行符”
  • VCAST创建单元测试工程
  • 【Java】解决Java报错:NumberFormatException
  • [qt] qt程序打包以及docker镜像打包
  • hw meta10 adb back up DCIM
  • 2_1 Linux基础操作
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • create-react-app做的留言板
  • es6--symbol
  • js面向对象
  • JS题目及答案整理
  • Mysql数据库的条件查询语句
  • Python学习之路13-记分
  • SegmentFault 2015 Top Rank
  • SwizzleMethod 黑魔法
  • TypeScript实现数据结构(一)栈,队列,链表
  • 对JS继承的一点思考
  • 精彩代码 vue.js
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 突破自己的技术思维
  • 微服务核心架构梳理
  • ​什么是bug?bug的源头在哪里?
  • #《AI中文版》V3 第 1 章 概述
  • #FPGA(基础知识)
  • #pragma data_seg 共享数据区(转)
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (11)iptables-仅开放指定ip访问指定端口
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (windows2012共享文件夹和防火墙设置
  • (二)Linux——Linux常用指令
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (三)SvelteKit教程:layout 文件
  • (十六)视图变换 正交投影 透视投影
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (十五)使用Nexus创建Maven私服
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (轉)JSON.stringify 语法实例讲解
  • *1 计算机基础和操作系统基础及几大协议
  • .net core 管理用户机密