結合mysql查詢優化器對聯合索引的探討

無陳述,直接開講:mysql

babysitter_account表中的聯合索引以下(開發小夥伴們自建的聯合索引、您發現不妥了嗎?):
sql

KEY `flag` (`flag`,`user_id`,`account_id`)

過去認爲:ide

1.SELECT account_id,weibo_id,weibo_type FROM babysitter_account WHERE user_id BETWEEN 100 and 10000 AND flag=0; 
2.SELECT account_id,weibo_id,weibo_type FROM babysitter_account WHERE flag=0 AND user_id BETWEEN 100 and 10000;
優化

第一條sql沒法命中索引、第二條會命中,spa

可是現實狀況是兩條sql命中的索引徹底同樣。orm

wKioL1TV81TwtnIMAADE6Pd6IIY023.jpg

wKiom1TV8mXiRd-7AADjD-7ogy0933.jpg

由於mysql的查詢優化器會優化sql,優化器會根據存取類型選擇合適的驅動表達式,對於這兩條sql來講驅動表達式同樣。blog

查詢優化器對where帶AND的查詢優化選擇規則以下:索引

查詢的格式爲:<condition> AND <condition>開發

 優化的步驟:get

1)        若是兩個列都沒有索引,那麼使用全表掃描。

2)        不然,若是其中一個列擁有更好的存取類型(好比,一個具備索引,另一個沒有索引;再或者,一個是惟一索引,另一個是非惟一索引),那麼使用該列做爲驅動表達式。

3)        不然,若是兩個列都分別擁有索引,而且兩個條件對應的存取類型是一致的,那麼選擇定義索引時的先定義的索引。

倆條件都有索引且相同,因此存取類型都同樣,而且沒有前後定義的順序,因此執行徹底同樣。

PS:account_id加在聯合索引裏徹底無心義,自己就是主鍵,優先命中,只有拖慢入庫的速度。

相關文章
相關標籤/搜索