MySQL:explain結(jié)果中Extra:Impossible?WHERE?noticed?after?reading?const?tables問題
前情提要
上午有同事突然找我,向我反饋說在對MySQL中的語句進行explain解析的時候,explain的結(jié)果中table、type、possible_keys、key等關鍵性字段都是空的,什么信息都得不到,而當把其中一個字段phone,類型是varchar的單引號去掉了之后,也就是說把where phone='13800138000' 改為where phone=13800138000之后,再執(zhí)行explain就能得到explain的關鍵性字段的結(jié)果了。
這個就讓我很納悶,不合常理啊,字段的隱式轉(zhuǎn)換正常來說這種情況應該會導致索引失效才對啊,現(xiàn)在竟然是反之生效,刷新了我們的認知。
我就說了下面一句話:
一個不合常理的現(xiàn)象往往都是由于一個不起眼的或者平時被我們忽略的點所造成的
出現(xiàn)的情況
這種非常理所能解釋通的現(xiàn)象,引起了我的好奇心。

從上圖中看到Extra:Impossible WHERE noticed after reading const tables,字面上的意思是:讀取const tables表之后,沒有發(fā)現(xiàn)匹配的行。
其實,這個跟MySQL的版本有關,在 MySQL 5.7.17 下的執(zhí)行結(jié)果中可以發(fā)現(xiàn)同樣的表結(jié)構(gòu)、同樣的數(shù)據(jù)、同樣的查詢語句,Extra 中的顯示的內(nèi)容為“no matching row in const table”,這句話理解起來就容易多了。
原因
產(chǎn)生“ Impossible WHERE noticed after reading const tables”的原因是這樣的,MySQL在 EXPLAIN 之前會優(yōu)先根據(jù)這一條件查找出對應的記錄,并用記錄的實際值替換查詢中所有使用到的該表屬性。
這是因為滿足以下四個條件時,就會使得針對該表的查詢最多只能產(chǎn)生一條命中結(jié)果,在該表無法命中數(shù)據(jù)的情況下就會提示“在 const table 表中沒有找到匹配的行”,而這個 “const table”就指的是滿足下面四個條件的表。
這是 MySQL 的一個優(yōu)化策略。
- 當查詢條件中包含了某個表的主鍵或者非空的唯一索引列
- 該列的判定條件為等值條件
- 目標值的類型與該列的類型一致
- 目標值為一個確定的常量
而我們的這張表user_info的這個查詢語句剛好符合這4個條件,原因:
1、phone是非空的唯一索引列;
2、phone= '13800138000’是等值條件
3、phone是字符串類型,'13800138000’也是字符串類型
4、13800138000是一個確定的常量
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
mysql?in索引慢查詢優(yōu)化實現(xiàn)步驟解析
這篇文章主要為大家介紹了mysql?in慢查詢優(yōu)化實現(xiàn)步驟的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
you *might* want to use the less safe log_bin_trust_function
you *might* want to use the less safe log_bin_trust_function_creators variable2011-07-07
關于skip_name_resolve參數(shù)的總結(jié)分享
下面小編就為大家?guī)硪黄P于skip_name_resolve參數(shù)的總結(jié)分享。小編覺得挺不錯的,現(xiàn)在分享給大家。給大家一個參考。一起跟隨小編過來看看吧2016-03-03
Mysql寫入數(shù)據(jù)十幾秒后被自動刪除了如何解決
這篇文章主要介紹了Mysql寫入數(shù)據(jù)十幾秒后被自動刪除了如何解決,文章通過圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09
快速增加MYSQL數(shù)據(jù)庫連接數(shù)負載能力的方法分享
mysql數(shù)據(jù)庫的負載能力除了和你機器硬件有關,還有一個重要參數(shù)就是你系統(tǒng)的配置有關,下面我來給大家介紹幾種提高MYSQL數(shù)據(jù)庫連接數(shù)負載能力方法總結(jié),有需要的朋友可以參考一下2013-08-08
MySQL5.7不停業(yè)務將傳統(tǒng)復制變更為GTID復制的實例
下面小編就為大家?guī)硪黄狹ySQL5.7不停業(yè)務將傳統(tǒng)復制變更為GTID復制的實例。小編覺的挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03

