對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;
我不知道是版本的原因還是什麼;

所以說,實踐纔是檢驗真理的唯一標準,大家一定要自己去試試,說不定會有意外的發現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章