范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

技术分享EXPLAIN执行计划详解(2)Extra

  作者:胡呈清
  爱可生 DBA 团队成员,擅长故障分析、性能优化,个人博客:https://www.jianshu.com/u/a95ec11f67a8,欢迎讨论。
  本文来源:原创投稿
  *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  Extra
  Extra 是 EXPLAIN 输出中另外一个很重要的列,该列显示 MySQL 在查询过程中的一些详细信息。
  Using index
  使用索引覆盖的情况下,执行计划的 extra 会显示为 "Using index":
  查询的字段都包含在使用的索引中;
  where 子句使用的字段也都包含在使用的索引中。
  比如:
  有组合索引:idx_a(first_name,last_name,birth_date)mysql> explain select first_name,last_name,birth_date from employees where
  first_name="Mayuri" and last_name like "Alpay" and birth_date > "1968-01-01"G
  *************************** 1. row ***************************
  id: 1
  select_type: SIMPLE
  table: employees
  partitions:
  type: range
  possible_keys: idx_a
  key: idx_a
  key_len: 127
  ref:
  rows: 1
  filtered: 100.00
  Extra: Using where; Using index
  Using index condition
  查询数据时如果使用 index condition down 索引条件下推就会在执行计划的 extra 字段中出现 "Using index condition"。
  使用二级索引查找数据时,where 条件中属于索引一部分但无法使用索引的条件(比如 like "%abc" 左侧字符不确定),MySQL 也会把这部分判断条件下推到存储引擎层,筛选之后再进行回表,这样回表时需要查找的数据就更少。
  索引条件下推的特点:
  下推的条件涉及的字段一定要是使用到的二级索引的一部分,因为二级索引索引存储了这些字段的值,才能进行筛选,所以叫做"索引条件下推";
  大幅减小回表时的随机 I/O 开销。因为索引条件下推可以在查找完二级索引后利用条件筛选,减小结果集,减小接下来回表的次数,而回表做的是随机 I/O(开销大),所以能够节省大量的 I/O 开销;
  大幅减小了存储引擎层到 MySQL 服务层的传输开销。条件下推给了存储引擎层,提前进行筛选,这样返回给 MySQL 服务层的数据就变少了;
  剩下的不能用到索引的 where 条件还是在 MySQL 服务层生效。
  示例 1
  有一个组合索引:idx_a(first_name,last_name,birth_date)
  SQL:mysql> explain select * from employees where first_name="Mayuri" and last_name like "%Alpay"G
  *************************** 1. row ***************************
  id: 1
  select_type: SIMPLE
  table: employees
  partitions:
  type: ref
  possible_keys: idx_a
  key: idx_a
  key_len: 58
  ref: const
  rows: 230
  filtered: 11.11
  Extra: Using index condition
  1 row in set, 1 warning (0.00 sec)
  查询的 where 子句中 first_name="Mayuri" 条件可以使用到二级索引 idx_a,而 last_name like "%Alpay" 条件最左的字符不固定所以不能使用二级索引。索引下推的执行过程是:
  通过二级索引 idx_a 查找满足 first_name="Mayuri" 条件的记录;
  MySQL 把条件 last_name like "%Alpay" 下推到 InnoDB 层,对上一步的结果进行筛选(因为 last_name 是索引 idx_a 的一部分,所以可以直接筛选,否则不行);
  取出上一步结果中的主键值,进行回表。
  示例 2
  有一个组合索引:idx_a(first_name,last_name,birth_date)
  SQL: select * from employees where first_name > "Mayuri" and last_name = "Alpay";
  在索引树上 first_name > "Mayuri" 的数据行,对于 last_name 的值来说是无序的。所以搜索索引树时,只能用 first_name > "Mayuri" 来找出数据,然后再把 last_name = "Alpay" 这个条件下推到 innodb 层筛选数据。
  示例 3
  有一个组合索引:idx_a(first_name,last_name,birth_date)
  SQL 为:mysql> explain select * from employees where first_name="Mayuri" and last_name > "Alpay"G
  *************************** 1. row ***************************
  id: 1
  select_type: SIMPLE
  table: employees
  partitions:
  type: range
  possible_keys: idx_a
  key: idx_a
  key_len: 124
  ref:
  rows: 226
  filtered: 100.00
  Extra: Using index condition
  虽然这里显示了 "Using index condition",但实际上是不需要做索引条件下推的,因为索引的第一个字段固定,对于 last_name 字段值来说也是有序的。这属于一个 "bug",特地考古找到了丁奇老师回复的一条评论:
  示例 4
  如果是索引覆盖不需要回表,即使发生索引条件下推,也不会出现 "Using index condition":mysql> explain select first_name,last_name,birth_date from employees where
  first_name > "Mayuri" and last_name > "Alpay"G
  *************************** 1. row ***************************
  id: 1
  select_type: SIMPLE
  table: employees
  partitions:
  type: range
  possible_keys: idx_a
  key: idx_a
  key_len: 124
  ref:
  rows: 226
  filtered: 100.00
  Extra: Using where; Using index
  小结
  总的来说,只要是用到 index filter,就会发生索引条件下推。但不一定出现 Using index condition 就一定发生了索引条件下推。关于 index filter 的概念,详见:SQL 中的 where 条件,在数据库中提取与应用浅析。
  https://www.jianshu.com/p/89ec04641e72
  Using where
  就是前面说的 MySQL 服务层可以把属于索引的一部分但又无法使用索引的条件下推到存储引擎层,而其他条件还是得在 MySQL 服务层应用来过滤存储引擎层返回的数据。当出现这的情况,执行计划的 extra 字段就会出现 "Using where",它可以和 "Using index" 一起出现,也可以和 "Using index condition" 一起出现。
  全表扫描的时候,MySQL 服务层应用 where 条件过滤数据mysql> explain select emp_no,first_name,last_name from employees where hire_date = "1959-12-06"G
  *************************** 1. row ***************************
  id: 1
  select_type: SIMPLE
  table: employees
  partitions:
  type: ALL
  possible_keys:
  key:
  key_len:
  ref:
  rows: 299454
  filtered: 10.00
  Extra: Using where
  使用索引访问数据,但是 where 子句中有除了该索引包含的字段之外的条件时。mysql> explain select emp_no,first_name,last_name from employees where first_name="Mayuri" and hire_date = "1959-12-06"G
  *************************** 1. row ***************************
  id: 1
  select_type: SIMPLE
  table: employees
  partitions:
  type: ref
  possible_keys: idx_a
  key: idx_a
  key_len: 58
  ref: const
  rows: 230
  filtered: 10.00
  Extra: Using where
  使用索引访问数据,并达到索引覆盖,但是 where 子句中有属于索引一部分但无法使用索引的条件(比如 like "%abc" 左侧字符不确定)条件时:mysql> explain select first_name,last_name,birth_date from employees where first_name="Mayuri" and last_name like "%Alpay"G
  *************************** 1. row ***************************
  id: 1
  select_type: SIMPLE
  table: employees
  partitions:
  type: ref
  possible_keys: idx_a
  key: idx_a
  key_len: 58
  ref: const
  rows: 230
  filtered: 11.11
  Extra: Using where; Using index
  使用索引访问数据,并且使用索引条件下推,并且 where 子句中有除了该索引包含的字段之外的条件时mysql> explain select * from employees where first_name="Mayuri" and last_name like "%Alpay" and hire_date>"1969-01-01"G
  *************************** 1. row ***************************
  id: 1
  select_type: SIMPLE
  table: employees
  partitions:
  type: ref
  possible_keys: idx_a
  key: idx_a
  key_len: 58
  ref: const
  rows: 230
  filtered: 3.70
  Extra: Using index condition; Using where
  文章推荐:
  技术分享 | EXPLAIN 执行计划详解(1)
  社区近期动态
  本文关键字:#explain# #extra# #索引#

吉祥三宝,六一节快乐这个六一儿童节礼物不但太大而且送礼物的节奏很密集。估计昨晚有两个建设银行和两个招商银行的家庭蠢蠢欲动了,国家有好政策,不生吧,难圆儿女双全之美。生吧,超人般的宝妈们确实头大的嗡嗡的11岁孩子早晚喝牛奶会长高吗?喝牛奶能不能长高呢?答案是肯定的,我也是孩子的家长,从小不管是配方奶还是纯牛奶都没有断过,对于我来说,希望我的孩子能够长得高高大大的,现在这个社会就是个看脸的社会,长得好看高大强壮宝宝几天洗一次头最好?不同年龄有不同讲究对于新生儿来说,他们的头皮头发并不受出汗或者是环境粉尘导致的污染,所以并不需要每日清洗。刚刚出生的婴儿可以用清洁的自来水冲洗头发,来清洁羊水胎粪附着物。在出生后的第一个月,新生儿宝新标准助力儿童健康成长玩具适用年龄出判定指南来源中国消费者报5月28日,市场监管总局(国家标准委)集中发布了包括婴儿纸尿裤婴童浮力泳装柔巾婴幼儿腰凳玩具等的适用年龄判定指南,视疲劳测试与评价方法,婴儿奶嘴用液体硅橡胶判定指南动画片超越娱乐陪伴成长动画片,是大多数人童年记忆成长的重要组成部分。动画片,是部分家长为孩子打发时间的方式。动画片会在不经意间塑造儿童的价值取向和行为方式,对孩子成长的重要性不言而喻。这个六一,让我们聊北京多措并举优化儿童健康服务,06岁儿童肥胖率下降超10昨天,市卫健委举办守护明眸健体强身六一国际儿童节主题宣传活动。记者了解到,近年来,本市多措并举优化儿童健康服务,十三五时期,06岁儿童肥胖患病率下降超过10。资料图冯晨清制图预防小你在病房里见过哪些忘不掉的事?54岁的母亲突然疼痛难忍,自己叫120去医院。同住一屋的儿子不仅没有送她,而且还给她分享安乐死的文章,发语音说你不是说想死吗,还去医院抢救干嘛?那不是浪费资源吗?这件奇葩的事情,就本市0至6岁儿童肥胖患病率下降超10以儿童眼保健和预防儿童肥胖为重点,昨天上午,本市举办守护明眸健体强身2021年六一国际儿童节主题宣传活动。北京青年报记者从市卫健委了解到,本市多措并举优化儿童健康服务,比如,持续推2021男人带娃实录,点进来需要勇气我转过了最近男孩的记录,我感到震惊。发生了什么,发生了什么,过去三天在哪里,不要吐我的丈夫,你走吗?现在我实际上看起来像一个正常的育儿博客,我的母亲是可怕的。必须是背景中有太多守护六一国际儿童节孩子的节日,如何正确解锁吃喝玩乐孩子简称娃属性神兽昵称熊孩子儿童节是属于孩子们的节日,每年到了此时,我们都少不了给孩子们送礼物送祝福。值此六一国际儿童节到来之际,给大家讲讲有关夏季的吃与动,让我们的孩子们更加快乐打消顾虑!三孩生育政策的配套支持措施意在全面降低生育成本六一国际儿童节前一天,一则关于孩子的消息瞬间让整个社会沸腾三孩生育政策放开。一开始看到这则消息的时候,内心还是有隐隐的担忧我们目前面临的并不仅仅是生育的问题,大多数人并非是不能生育
我好紧张!娃的考试要出成绩了我要上头条育儿土豆数学总分41分,考了34分,现在已经潇洒地去哈尔滨北京旅行过寒假了以前有位前辈老母亲听我抱怨辅导作业后,邪魅一笑别急,等到孩子上到高年级,你就不用发愁这件事了。还我也不想替孩子写作业,都是给逼的我要上头条育儿又到了我们学习干货栏目啦!上上周,在关于如何教孩子识字的推文下,有很多妈妈留言说想看数学的干货文。你们的话我都记在心里。这不,我立马请来这位娃数学特好的妈妈,看别人的我走了各种弯路后,饭渣娃终于肯吃饭了我要上头条育儿那段土豆挑食的日子,我无论和已婚的未婚的小伙伴聊天,最后都会顺利过渡到你家娃吃饭怎么样?你小时候吃饭怎么样?搞得大家都用奇怪的眼神看我快,请开始你的凡尔赛表演,我们来德国医生对我说让孩子早发现,早治疗我要上头条育儿有招画完这篇,我瞅了瞅旁边的土豆爸,他马上身子一紧。如果他还小的时候,就对用眼进行干预,也许现在就不是个瞎子了。我也就不用担心两个娃会近视了。哎,强大的遗传力量!番茄他们告诉我,孩子8岁了,不能再亲了我要上头条育儿每次亲土豆,他都是口嫌体直哎呀,妈妈别亲了!下一秒妈妈继续亲,不要停!土豆很享受我亲他,如果母子之间有不开心,没有一个抱抱亲亲是解决不了的。特别是像他这样敏感的孩子,妻子擅自流产,我能告她侵犯生育权吗我要上头条育儿生不生孩子这事,女人总算能自己做回主了!在2021年到来的前两日,最高法明确了几点关于婚姻的事彩礼家暴生育桩桩大快人心。就女人擅自中止妊娠这事,最高法说丈夫以妻子擅自当妈的看个电视剧,都这么大尺度了吗?我要上头条育儿最近我看了一部电视剧产后调理院,讲述了42岁高龄产妇生产和坐月子的故事。生产的过程,尺度不是一般大。女主待产的一开始被要求灌肠,因为怕生产过程中会有排泄物。紧接着被要有个男人第一次下厨,厨房爆炸了我要上头条育儿以下是专门写给土豆爸的续命文。我真的真的没有吐槽你洗坏了我3件真丝衬衫2件羊绒衫,收了我的衣服再也找不着。有你分担家务,我真是轻松了不少呢!有妈妈问怎么让大兄弟心甘情娃放寒假第7天,我不哭,不哭,哭我要上头条育儿娃一放寒假,真是像打仗,如果说平常遛娃的工作量是100,放寒假的时候就是200我有个同事,给娃列了详细的寒假计划。她指着计划表说要不然,我辞职在家带娃吧?寒假,对于老万万没想到,我居然被娃嫌弃了我要上头条育儿之前在网上看到一句话在年轻人眼里,一手哄着娃一手刷升学信息的中年人,已经是另一个世界的人了。扎心了有木有?我们也想赶潮流,学新知,奈何白天上班,晚上带娃辅导作业,只有后台收到一个孩子的留言,我有点难过又触动我要上头条育儿孤独症诗人迪金森曾经这样写道没人会记得这一朵蔷薇也许她从此就漂泊流离要不是我从路边捡起送与了你。星星上的孩子同样生活在地上,离你我都不远,对他们多一些关心,多一些包容