iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >一篇文章带你掌握MySQL索引下推
  • 262
分享到

一篇文章带你掌握MySQL索引下推

MySQL索引下推MySQL索引 2022-12-21 11:12:09 262人浏览 薄情痞子
摘要

目录1.什么是索引下推2.案例2.1.Mysql5.5版本2.2.mysql5.7版本3.小结1.什么是索引下推 索引下推(Index Condition PushDown,简称ICP)是从Mysql5.6开始引入的一个

1.什么是索引下推

索引下推(Index Condition PushDown,简称ICP)是从Mysql5.6开始引入的一个特性,索引下推通过减少回表的次数来提高数据库的查询效率;

2.案例

准备:

①.为了演示索引下推,需要安装MySQL5.5和MySQL5.7两个版本的MySQL,因为索引下推是MySQL5.6版本中开始引入的新特性,所以这两个版本就可以演示出索引下推的特点;

②.数据库脚本:

CREATE TABLE `user1` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `address` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `username` (`username`,`age`)
) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
insert into user1(username,age,address) values('zhangsan',25,'China'),('lisi',30,'China');

2.1.MySQL5.5版本

1>.精确匹配:

select * from user1 where username='zhangsan' and age=25;

一篇文章带你掌握MySQL索引下推

2>.查看执行计划

一篇文章带你掌握MySQL索引下推

type: ref表示通过索引查找数据,一般出现在等值匹配的时候,type为ref;

extra: Usering where表示数据在server层进行了过滤操作;

可以看到,这个查询SQL是使用了索引(非主键索引)的! 

在MySQL5.5中,由于没有索引下推,所以上面查询SQL的执行流程如下:

①.首先MySQL的server层调用存储引擎获取username='zhangsan’的一条记录;

②.存储引擎找到username='zhangsan’的第一条记录之后,在B+Tree的叶子节点中保存着主键id,此时通过回表操作,去主键索引中找到该条记录的完整数据,并返回给server层;

③.server层拿到数据之后,判断该条记录的age是否为25,如果是,就把该条记录返回给客户端,如果不是,那么就丢弃该条记录;

④.由于userame+age组成的复合索引只是一个普通索引,并不是唯一索引(如果是唯一索引,那么这个查询就到此结束了),所以还需要继续去搜索有没有满足条件的记录;

注意: 第④步的搜索方式,并不是直接去B+Tree中搜索.由于在username索引中,username字段的存储是有序的,即username='zhangsan'的记录都是挨着的,而B+Tree的叶子节点之间通果双向链表关联,通过一个叶子节点就能找到下一个叶子节点(或者上一个叶子节点),第②步返回的数据中有一个next_record属性,该属性就直接指向二级索引的下一条记录,找到下一条记录之后,回表拿到所有数据并返回给server层,然后重复③,④步; 

3>.模糊匹配:

select * from user1 where username like 'l%' and age=30;

一篇文章带你掌握MySQL索引下推

一篇文章带你掌握MySQL索引下推

type: range表示按照范围搜索;

也使用了索引,其SQL的执行流程跟上面一条查询SQL的执行流程基本一致! 

小结:

前面两个查询SQL,由于查询的时候是"select *",所以都是需要回表操作的,虽然是复合索引,索引中既有username又有age,但是查询条件中只能传入username到存储引擎中,从存储引擎中回表拿到一行数据的完整记录之后,再返回给server层,再在server层判断age是否满足条件.其实这样的查询效率比较低,明明索引中有age的值,但是却不在索引中比较age的值,而是要回表,取一行的完整记录出来,返回给server层,然后在和age去比较,要是比较不通过,这条记录就会被丢弃了.如果我们能够把age直接传入存储引擎,在存储引擎中直接去判断age是否满足条件.如果满足条件了,再去回表查询完整的记录.如果不满足条件就到此结束,这样就可以减少回表的次数,进而提高查询效率;

从MySQL5.6开始引进的索引下推技术,就是用来解决这样的问题的!

2.2.MySQL5.7版本

1>.模糊匹配:

select * from user1 where username like 'l%' and age=30;

一篇文章带你掌握MySQL索引下推

2>.查看执行计划:

一篇文章带你掌握MySQL索引下推

可以看到,MySQL5.7中的这个执行计划和上面MySQL5.5中的执行计划相比,主要是最后的Extra为"Using index condition",这就是MySQL5.6开始引入的索引下推技术(ICP);

执行流程如下:

①.MySQL中的server层首先调用存储引擎定位到第一个以"l"开头的username;

②.找到记录后,存储引擎并不急着回表,而是继续在存储引擎中判断这条记录的age是否为30,如果是,再去回表查询完整的记录;如果不是,不去回表了,直接继续读取下一条记录;

③.存储引擎将符合条件的数据返回给server层,此时如果还有其他非索引的查询条件,server层继续过滤,在上面的案例中,此时没有其他查询条件了,server层将最终的数据返回给客户端.假设server层还有其他的查询条件,并且这个查询条件把刚刚查到的记录过滤掉了,那么就会通过该记录中的next_record属性读取下一条记录,然后重复第②步;

这就是索引下推(Index Condition Pushdown,ICP),有效的减少了回表次数,提高了查询效率!

上面的案例索引下推的时候不仅判断age的值也判断username的值;

3>.精确匹配:

select * from user1 where username='zhangsan' and age=25;

一篇文章带你掌握MySQL索引下推

一篇文章带你掌握MySQL索引下推

可以看到,这个查询计划也使用了索引.如果最后的Extra为null,就表示没有额外的操作了,其实这只是一个特殊的处理而已,利用搜索条件"username='zhangsan' and age=25",从存储引擎中找到数据之后,没有再去重复判断了而已;

3.小结

所谓的索引下推,就是在搜索引擎中提前判断对应的搜索条件是否满足,满足了再去回表,通过减少回表次数进而提高查询效率;

到此这篇关于一篇文章带你掌握MySQL索引下推的文章就介绍到这了,更多相关MySQL索引下推内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: 一篇文章带你掌握MySQL索引下推

本文链接: https://www.lsjlt.com/news/175407.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一篇文章带你掌握MySQL索引下推
    目录1.什么是索引下推2.案例2.1.mysql5.5版本2.2.MySQL5.7版本3.小结1.什么是索引下推 索引下推(Index Condition PushDown,简称ICP)是从MySQL5.6开始引入的一个...
    99+
    2022-12-21
    MySQL索引下推 MySQL索引
  • 一篇文章读懂什么是MySQL索引下推(ICP)
    目录一、简介 二、原理 三、实践 3.1 不使用索引下推 3.2 使用索引下推 四、使用条件 五、相关系统参数 总结一、简介 ICP(Index Condition Pushdow...
    99+
    2024-04-02
  • MySQL带你秒懂索引下推
    目录一、索引下推优化的原理 二、索引下推的具体实践 1、没有使用ICP 2、使用ICP 三、索引下推使用条件 索引下推(Index Condition Pushdown,简称ICP)...
    99+
    2024-04-02
  • 一篇文章带你掌握C++虚函数的来龙去脉
    目录一切从继承讲起继承的语义是什么std::vector虚函数登场虚函数定义子类中如何改变一个虚函数的行为override 限定符final 限定符covariant 返回类型vir...
    99+
    2022-11-13
    C++虚函数 c++纯虚函数的作用 c++虚函数使用
  • 一篇文章带你入门python之推导式
    目录一、dict推导式二、list推导式三、set推导式四、含if推导式五、含for推导式总结一、dict推导式 list1 = ['name', 'age', 'gender'] ...
    99+
    2024-04-02
  • 一篇文章讲解清楚MySQL索引
    目录一丶什么是索引二丶索引的数据结构1.哈希表2.有序数组3.跳表4.平衡二叉搜索树5.B-树,B+树三丶InnoDB索引方案1.InnoDB行结构2.InnoDB页结构2.1行结构...
    99+
    2022-11-13
    MySQL索引 MySQL索引详解 mysql索引教程
  • 一篇文章带你了解清楚Mysql 锁
    一丶为什么数据库需要锁 数据库锁设计的初衷是处理并发问题。作为多用户共享 的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实 现这些访问规则的重要数据结构。 根据加锁的范围,mysql 里面...
    99+
    2022-11-29
    mysql锁机制 mysql锁机制应用场景 mysql锁表和解锁语句
  • 五分钟带你搞懂MySQL索引下推
    目录什么是索引下推索引下推优化的原理索引下推的具体实践没有使用ICP使用ICP索引下推使用条件相关系统参数总结如果你在面试中,听到MySQL5.6”、“索引优化” 之类的词语,你就要...
    99+
    2024-04-02
  • 一文带你掌握JavaImageIO类
    目录一、ImageIO 的基础知识1.1 ImageIO 的作用1.2 ImageIO 的特点1.3 ImageIO 的使用环境1.4 ImageIO 的基本使用方法二、ImageI...
    99+
    2023-05-20
    Java ImageIO类 Java ImageIO Java
  • 一文带你掌握Java LinkedBlockingQueue
    目录开篇语介绍实现原理构造函数插入函数获取函数入队函数出队函数应用场景适用场景实际应用场景总结开篇语 队列在生活中随处可见,医院缴费需要排队、做核酸需要排队、汽车等红绿灯需要排队等等...
    99+
    2023-05-14
    Java LinkedBlockingQueue实现 Java LinkedBlockingQueue原理 Java LinkedBlockingQueue
  • 一篇文章带你搞定JAVA Maven
    目录1、maven是什么,为什么存在?项目结构是什么样子,怎么定位jar2、Idea 的操作1.新建maven项目2.配置仓库3.添加依赖,添加fastjson的依赖4.打包项目3、...
    99+
    2024-04-02
  • 一篇文章带你入门Java Script
    目录概述特点和Java的区别弱类型语言强类型语言书写位置数组函数JS中的自定义对象(扩展内容)Object形式的自定义对象JS中的事件常用的事件:动态注册基本步骤:DOM模型总结概述...
    99+
    2024-04-02
  • 一篇文章让你快速掌握Pandas可视化图表
    目录前言1. 概述2. 图表元素设置3. 常见图表类型4. 其他图表类型总结前言 今天简单介绍一下Pandas可视化图表的一些操作,Pandas其实提供了一个绘图方法plot(),可...
    99+
    2024-04-02
  • 一篇文章带你自学python Django
    目录1. Django简介Django是什么?Django前景Django框架核心2. 设计模式MVT模式3. 开发环境简介4.创建虚拟环境4.1.首先安装管理环境的包以及虚拟环境包...
    99+
    2024-04-02
  • 一文带你轻松掌握Promise
    回调函数回调函数的定义非常简单:一个函数被当做一个实参传入到另一个函数(外部函数),并且这个函数在外部函数内被调用,用来完成某些任务的函数。就称为回调函数回调函数的两种写法(实现效果相同):const text = () => { ...
    99+
    2023-05-14
    javascript promise
  • 一篇文章带你了解XGBoost算法
    目录1. 什么是XGBoost1.1 XGBoost树的定义1.2 正则项:树的复杂度1.3 树该怎么长1.4 如何停止树的循环生成2. XGBoost与GBDT有什么不同3. 为什...
    99+
    2024-04-02
  • 一篇文章带你了解JavaScript-语句
    目录表达式语句复合语句和空语句复合语句空语句声明语句varfunction条件语句ifif/elseelse ifswitch循环whiledo/whileforfor/in跳转标签...
    99+
    2024-04-02
  • 一文带你彻底掌握Log4j2
    Log4j2是一个用于Java应用程序的日志记录工具,它提供了强大的日志记录功能,可以帮助开发人员更好地了解和调试应用程序的运行情况...
    99+
    2023-09-23
    Log4j2
  • 一篇文章带你搞定JAVA反射
    目录1、反射的概念1、概念2、获取字节码文件对象的方式2.1 元数据的概念2.2 获取class对象的方式1、访问权限2、获取方法2.1 访问静态方法2.2 访问类方法 3...
    99+
    2024-04-02
  • 一篇文章带你入门Java变量
    目录引言概念变量的四个基本属性如何定义变量如何使用变量变量的特点总结引言 ♀ 小AD:明哥,我终于出了这口恶气了。 ♂ 明世隐:打爽了是吧。 ♀ 小AD:那必须的,打十盘我赢九盘,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作