看到有資料說,where條件的順序會影響查詢的效率,根據的邏輯是:
where條件的運行是從右到左的,將選擇性強的條件放到最右邊,可以先過濾掉大部分的數據(而選擇性不強的條件過濾后的結果集仍然很大),在根據其它條件過濾時,需要比較的數據量就少,提高查詢的效率。
當我看到這個邏輯時,自我認為不是太合理,數據庫引擎在執行SQL語句時,都是要經過查詢優化器的,查詢優化器會將SQL進行優化,選擇最優的查詢計划來執行,查詢優化器應該會選擇最優的查詢計划,如果僅僅是因為where字句的順序不同,就不能選擇最優的查詢計划,那么查詢優化器得有多么差勁啊...
實踐是檢驗真理的唯一標准
實驗條件:
新建表test_condition,主鍵為id,還有兩列表示姓名的name和年齡的age,數據量為10萬條,年齡是18-45
單列的輔助索引
1. name列有索引
EXPLAIN SELECT id,name,age from test_condition where name='test99500' and age=30
查詢計划為
EXPLAIN SELECT id,name,age from test_condition where age=30 and name='test99500'
查詢計划為
從兩者的查詢計划上來看,兩個沒有什么區別。
2. name列有索引,age列有索引
EXPLAIN SELECT id,name,age from test_condition where name='test99500' and age=30
查詢計划
EXPLAIN SELECT id,name,age from test_condition where age=30 and name='test99500'
查詢計划
同樣沒有區別
多列的聯合索引
聯合索引<name,age>
表的索引:
1. 聯合索引的列都使用
EXPLAIN SELECT * from test_condition where `name`='test100' and age = 30
查詢計划:
EXPLAIN SELECT * from test_condition where age = 30 and `name`='test100'
查詢計划:
結論: 當聯合索引的列都出現在查詢條件中時,查詢條件的順序不影響。
2. 僅使用聯合索引中的一列
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遵循最左前綴原理,當查詢條件匹配聯合索引的前面幾列時,可以使用聯合索引;否則,不會使用聯合索引。
以上結果均是本人一次測試的結果,僅供參考,如有不對,歡迎指正。
轉自:https://www.cnblogs.com/acode/p/7489258.html