前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >5分钟搞懂MySQL - 索引下推优化

5分钟搞懂MySQL - 索引下推优化

作者头像
陈哈哈
发布2021-10-13 14:25:47
4430
发布2021-10-13 14:25:47
举报
文章被收录于专栏:MySQL入坑记MySQL入坑记

小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL江湖路 | 专栏目录

  对于长期与MySQL同流合污的朋友们来说,或许,“索引下推优化”这个词并不陌生,嗯。。经常听到,但是MySQL的这个“优化”到底优化了啥?就懵懵懂懂了,反正不是公司优化我就行了是吧。。来,让我们继续快乐的卷下去~

在这里插入图片描述
在这里插入图片描述

  其实呢,这个索引下推优化起源于MySQL5.6版本,全名叫:“索引条件下推”,英文名字 Index Condition Pushdown,我们叫他 ICP吧,ICP的诞生主要是为了进一步提高B+Tree索引查询的可用性。

  它的作用通俗一些的话,我们举个栗子。

  如下,在表 T 创建联合索引 index(name,age)

代码语言:javascript
复制
select * from T where name like '提莫%' and age = 100;
  • MySQL没有索引下推优化时:

  对于联合索引index(name,age),我们知道,根据B+Tree天然有序的存储特性,LIKE + 右侧模糊匹配虽可以使用到name索引,但模糊匹配后得到的结果变成无序,所以后面条件无法再使用到索引,因此需回表提取出name like '提莫%'结果集后,再通过普通查询得到age = 100的最终结果。

  那么 age 字段的索引就这么浪费了么?MySQL想白嫖我服务器资源?

在这里插入图片描述
在这里插入图片描述

  通过参考李海翔老师的流程图,我们可以看出,没有索引下推的情况下,第三步从索引树上取到 name like ‘提莫%’ 数据后,就回表了,后续再处理where剩下的条件,剩下的条件在我们这里也就是 age = 100;相当于多了一次查询过滤操作。

  机灵的小伙伴发现,索引字段换个顺序不就得了?聪明~ 这确实是5.6之前的一种处理方式,但缺点也很明显,比如字段过滤数据能力降低,没了免费午餐(排序)等~

  • MySQL引入了ICP优化后;
在这里插入图片描述
在这里插入图片描述

  如图,在索引内部取到name结果之后(步骤3),步骤4就顺便判断了结果中的age是否等于100,对于不等于100的记录直接跳过,因此在index(name,age)这棵索引树中直接匹配到了结果记录,减少了完整查询记录(一条完整元组)读取的个数,此时拿着结果集的id去主键索引树中回表查询全部数据,减少了二次查询时间,I/O次数也会减少。

Cool~

代码语言:javascript
复制
mysql> explain select name from T where name like '提莫%' and age = 100;
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+--------------------------+
| id | select_type | table | partitions | type  | possible_keys | key        | key_len | ref  | rows | filtered | Extra                    |
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+--------------------------+
|  1 | SIMPLE      | T     | NULL       | range | index_name    | index_name | 72      | NULL |    3 |    25.00 | Using index condition    |
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+--------------------------+
1 row in set, 1 warning (0.00 sec)

  当你在使用Explain解析SQL时,可以看出Extra的值为Using index condition,表示已经使用了索引下推。

附、一张有故事的照片(十五)

在这里插入图片描述
在这里插入图片描述

吉林的一位母亲因癌症晚期 担心去世后照顾不了孩子 在她生命的最后一段时间里 给儿子织完了25岁之前需要的所有毛裤

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-03-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 附、一张有故事的照片(十五)
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档