無陳述,直接開講: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
由於mysql的查詢優化器會優化sql,優化器會根據存取類型選擇合適的驅動表達式,對於這兩條sql來講驅動表達式同樣。blog
查詢優化器對where帶AND的查詢優化選擇規則以下:索引
查詢的格式爲:<condition> AND <condition>開發
優化的步驟:get
1) 若是兩個列都沒有索引,那麼使用全表掃描。
2) 不然,若是其中一個列擁有更好的存取類型(好比,一個具備索引,另一個沒有索引;再或者,一個是惟一索引,另一個是非惟一索引),那麼使用該列做爲驅動表達式。
3) 不然,若是兩個列都分別擁有索引,而且兩個條件對應的存取類型是一致的,那麼選擇定義索引時的先定義的索引。
倆條件都有索引且相同,因此存取類型都同樣,而且沒有前後定義的順序,因此執行徹底同樣。
PS:account_id加在聯合索引裏徹底無心義,自己就是主鍵,優先命中,只有拖慢入庫的速度。