看到有資料說,where條件的順序會影響查詢的效率,根據的邏輯是:數據庫
where條件的運行是從右到左的,將選擇性強的條件放到最右邊,能夠先過濾掉大部分的數據(而選擇性不強的條件過濾後的結果集仍然很大),在根據其它條件過濾時,須要比較的數據量就少,提升查詢的效率。測試
當我看到這個邏輯時,自我認爲不是太合理,數據庫引擎在執行SQL語句時,都是要通過查詢優化器的,查詢優化器會將SQL進行優化,選擇最優的查詢計劃來執行,查詢優化器應該會選擇最優的查詢計劃,若是僅僅是由於where字句的順序不一樣,就不能選擇最優的查詢計劃,那麼查詢優化器得有多麼差勁啊...優化
實驗條件:
新建表test_condition,主鍵爲id,還有兩列表示姓名的name和年齡的age,數據量爲10萬條,年齡是18-453d
EXPLAIN SELECT id,name,age from test_condition where name='test99500' and age=30
查詢計劃爲
code
EXPLAIN SELECT id,name,age from test_condition where age=30 and name='test99500'
查詢計劃爲
blog
從二者的查詢計劃上來看,兩個沒有什麼區別。索引
EXPLAIN SELECT id,name,age from test_condition where name='test99500' and age=30
查詢計劃
it
EXPLAIN SELECT id,name,age from test_condition where age=30 and name='test99500'
查詢計劃
io
一樣沒有區別test
表的索引:
EXPLAIN SELECT * from test_condition where `name`='test100' and age = 30
查詢計劃:
EXPLAIN SELECT * from test_condition where age = 30 and `name`='test100'
查詢計劃:
結論: 當聯合索引的列都出如今查詢條件中時,查詢條件的順序不影響。
EXPLAIN SELECT * from test_condition where `name`='test100'
查詢計劃:
EXPLAIN SELECT * from test_condition where age = 30
查詢計劃:
修改表結構,增長dept列
EXPLAIN SELECT * from test_condition where `name`='test100'
查詢計劃:
EXPLAIN SELECT * from test_condition where age = 30
查詢計劃:
在表只有id,name,age時,查詢時仍然會用到索引,應該是由於使用到了覆蓋索引(查詢結果列在索引中都存在)。
當修改完表結構後,能夠明確地看出,name條件查詢用到了聯合索引;而age查詢時,使用不到聯合索引。
結論:MySQL遵循最左前綴原理,當查詢條件匹配聯合索引的前面幾列時,能夠使用聯合索引;不然,不會使用聯合索引。
以上結果均是本人一次測試的結果,僅供參考,若有不對,歡迎指正。