我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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索引下推内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

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

目录1.什么是索引下推2.案例2.1.mysql5.5版本2.2.MySQL5.7版本3.小结1.什么是索引下推索引下推(Index Condition PushDown,简称ICP)是从MySQL5.6开始引入的一个特性,索引下推通过减
2022-12-21

一篇文章带你掌握SQLite3基本用法

目录一、基本语法1.常用指令2.数据类型3.创建数据库4. 导入/导出数据库5.创建表6.查看表的详细信息7.删除表8.插入数据9.格式化输出10.输出表11.运算符12.where子句13.删除记录表中的数据14.update语句二、C/
2022-06-13

这篇文章带你全面掌握 Nginx !

作为一名开发人员,你是不是经常碰到领导让你上服务器去修改 Nginx 配置,然而你可能会对这些配置并不熟悉!今天就让我们一起告别这种尴尬,向“真正”的程序员迈进。

一篇文章带你了解C# 索引器

索引器(Indexer) 允许一个对象可以像数组一样使用下标的方式来访问。当您为类定义一个索引器时,该类的行为就会像一个 虚拟数组(virtual array) 一样。您可以使用数组访问运算符 [ ] 来访问该类的的成员。

一篇文章带你掌握C++虚函数的来龙去脉

虚函数主要通过V-Table虚函数表来实现,该表主要包含一个类的虚函数的地址表,可解决继承、覆盖的问题,下面这篇文章主要给大家介绍了如何通过一篇文章带你掌握C++虚函数的来龙去脉,需要的朋友可以参考下
2022-11-13

一篇文章带你了解JavaScript math(下篇)

JavaScript的Math对象允许你对数字进行数学操作。上篇文章我们已经介绍了基本的Math函数用法,这篇文章我们来讲讲三角函数还有部分其他函数的用法。
avaScriptmath2024-12-14

一篇文章带你了解JavaScript window navigator(下篇)

window.navigator 对象包含有关访问者浏览器的信息。上篇文章介绍了浏览器Cookies、浏览器应用程序名称、项目浏览器应用程序代码名称、浏览器引擎、浏览器版本等属性,这篇文章继续介绍其他的属性。

一篇文章讲解清楚MySQL索引

这篇文章主要用一篇文章讲解清楚MySQL索引的相关资料,十分的细致全面,推荐给大家,需要的朋友可以参考下
2022-11-13

一篇带给你MySQL高性能索引

在MySQL中,索引是在存储引擎层实现的而不是Server层实现的,所以不同的存储引擎的索引的工作方式是不一样的。我们对索引的分析应该是建立在存储引擎的基础上的,InnoDB是MySQL默认的存储引擎。

一篇文章带你了解清楚Mysql 锁

一丶为什么数据库需要锁数据库锁设计的初衷是处理并发问题。作为多用户共享 的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实 现这些访问规则的重要数据结构。根据加锁的范围,mysql 里面的锁大致可以分成全局
2022-11-29

一篇带给你MySQL索引知识详解

索引的出现其实就是为了提高数据查询的效率,在表数据量较大时,索引的重要性尤为突出,可以理解为索引就像书的目录一样。

一篇文章让你掌握 Go 语言的 Defer 关键字

​​defer​​ 是 Go 语言中一个非常有用的工具,它帮助我们确保资源的正确管理,特别是在涉及到文件操作时。通过理解 ​​defer​​ 的工作原理,我们可以编写出更加健壮和易于维护的代码。

编程热搜

目录