这本来是个简单的玩意儿,但我始终不太明白这个到底是什么情况下才会出现,又代表了什么。

来看一下mysql官方文档对using where的解释:

A WHERE clause is used to restrict which rows to match against the next table or send to the client.

原谅我的愚蠢,还是一头雾水。(有知道的大佬还希望能指点一下,万分感谢!)

再来看看高性能MYSQL第三版对它的解释:

using where 代表MYSQL服务器层将在存储引擎层返回行以后再应用WHERE过滤条件

好像有点感觉了,但还是差点;

这个链接https://www.oschina.net/question/232911_2307882中的查询我用mysql5.7实验不会有using where;

https://blog.csdn.net/jeffrey11223/article/details/79100761这个链接中的一些例子在mysql5.7也不对;

那就来做下实验吧。我建了个表,有一个联合索引key(join_index_1, join_index_2),还有一个普通字段pwd;

explain select `pwd` from `lb_user_5` where  `join_index_1` = 'fsda';

-> extra的值为NULL,key表示用了索引;

-> 因为联合索引嘛,所以在存储引擎层就利用where条件找到了相应的记录,然后回表,再取出pwd值,所以server层是不需要再使用where条件过滤的;

explain select `join_index_2` from `lb_user_5` where  `join_index_1` = 'fsda';

-> extra的值为using index,使用了联合索引;

-> 这个和上面类似,只是不需要回表,直接扫描联合索引树就可以了,where条件还是在存储引擎层过滤的;

explain select `join_index_1` from `lb_user_5` where  `join_index_2` = 'fsda';

-> extra的值为using where;using index,依然使用了联合索引;

-> 首先这个不符合最左匹配,按理说是不能使用联合索引的,但这里的select值决定了是可以使用的;因为我们要select的值也正好在这个联合索引树中,所以mysql会直接扫描这个联合索引树,而不会全表扫描;而这里是需要using where的,因为join_index_2在这个联合索引中是没有排好序的(不明白的就去查一下“最左匹配原则”),所以必须对这棵联合索引树进行“全表扫描”,存储引擎层扫描完后将所有的结果发送到了服务器层,这时服务器层需要使用`join_index_2` = 'fsda'来进行过滤,所以就有了using where;

另外提一下,我在自己做实验之前也在看了其他的一些文章,例如这一篇

https://blog.csdn.net/jeffrey11223/article/details/79100761

但我在5.7中用他的sql实验发现

explain select aaa from table where xxx=’something’和 explain select yyy from table where xxx=’something’
都没有using where;
我不知道是版本的原因还是什么;

所以说,实践才是检验真理的唯一标准,大家一定要自己去试试,说不定会有意外的发现。

对MYSQL的explain中extra using where的理解相关推荐

  1. mysql的explain中type取值与SQL性能优化的关系

    本文转载自[1],对[1]进行了整理 explain结果中的type字段列表: type字段取值  说明 SQL示范 扫描条件 建表特点 system 系统表,少量数据,往往不需要进行磁盘IO: ex ...

  2. Mysql explain 中的extra字段 解读

    extra 是 explain 中比较重要的一个属性指标之一,标识着SQL语句的索引使用情况. 接下来 讲讲常用见的几种状态. Using filesort 这种情况是在使用 order by 关键字 ...

  3. mysql之执行计划——explain中的extra详解

    之前一直对explain中的extra和type两个类型混淆.其实两者完全不同,type列和覆盖索引毫无关系,它只是表示这个查询访问数据的方式,或者说是MySQL查询行的方式. 我们使用一个例子来讲解 ...

  4. JAVA中Explain注解用法,mysql之explain详解(分析索引最佳使用)

    mysql之explain详解(分析索引最佳使用) mysql explain用于分析sql 语句的执行及数据库索引的使用.本文将致力于帮助大家充分理解explain所返回的各项参数,从而使大家快速掌 ...

  5. mysql explain中key_len值的说明

    在mysql 的explain的输出中,有个key_len的列,其数据是如何计算的呢? 在看到了淘宝的dba以前发布的博客后,我在mysql 5.6上操作一番,了解了一点. 环境准备 – 创建表. u ...

  6. mysql key_len_浅谈mysql explain中key_len的计算方法

    mysql的explain命令可以分析sql的性能,其中有一项是key_len(索引的长度)的统计.本文将分析mysql explain中key_len的计算方法. 1.创建测试表及数据 CREATE ...

  7. mysql执行计划中 性能最好_MySQL性能优化-explain执行计划

    explain用于获取查询执行计划信息, 一.语法 只需要在select前加上explain即可,如: mysql> explain select 1; +----+-------------+ ...

  8. Explain信息中Extra字段解释

    文章目录 explain 执行计划中 extra 常见内容说明 extra 字段内容 Using filesort Using temporary Using index Using index co ...

  9. MySQL和Oracle中的隐式转换

    今天在处理一个问题的时候,需要根据其他部门提供的sql语句对一个表中的数据进行了筛查. 语句类似下面的形式 > SELECT MAX_LEVEL,LOGOUT_TIME,CURRENT_DATE ...

最新文章

  1. “假一赔十”的4k 120Hz电视能买吗?研究完我服了,水是真的深
  2. python3 psutil模块 进程和系统信息
  3. Smarty变量调节器的使用
  4. tomcat server.xml各个端口的作用
  5. python文件读取 ,json文件的存储
  6. 使用Java程序通过http post访问Application server
  7. shell 文件路径有空格_Python学习第57课-shell入门之基本简单命令(一)
  8. node 创建静态服务器并自动打开浏览器
  9. 老兵不死:Radionomy正式宣布收购Winamp
  10. 谈谈大型分布式网站架构技术总结
  11. Oracle的共享关闭 独有关闭和共享更新关闭 (2)
  12. 算法合集之《信息学中守恒法的应用》
  13. 430单片机实现三人投票表决器_基于51单片机的三人表决器设计.doc
  14. Turbo码相关学习
  15. 指派问题java实现_指派问题及实现代码示例.ppt
  16. 线程的学习,和线程的相关概念及多线程的学习指引
  17. python实践报告的心得体会_动物医学实践报告心得体会
  18. 医用计算机是什么意思,pc是什么意思(全网最全解读pc寓意)
  19. Machine Learning读书会,面试算法讲座,算法公开课,创业活动,算法班集锦
  20. 万字讲解OpenWrt防火墙iptables,并使用UCI配置防火墙

热门文章

  1. WordPress 使用 CDN 后获取访客真实 IP
  2. 单元节点和积分点有什么区别
  3. 小米智能插座、小米温湿度计2、涂鸦灯泡 接入Home Assistant
  4. 自制动漫小姐姐图片api
  5. 微信小程序 实现美团外卖 菜单分类,左右联动 效果
  6. 英语修辞手法( rhetorical devices)
  7. ubantu + anaconda + TensorFlow 1.13.1
  8. 哔哩哔哩 2019校园招聘 开发工程师-2018.09.21
  9. 机器人视觉系统由哪些结构组成?
  10. Vue 2.x折腾记 - (16) 基于Ant Design Vue 封装一个配置式的表单搜索组件