对MYSQL的explain中extra using where的理解

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

来看一下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;
我不知道是版本的原因还是什么;

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值