MySQL查詢where條件的順序對查詢效率的影響

看到有資料說,where條件的順序會影響查詢的效率,根據的邏輯是:數據庫

where條件的運行是從右到左的,將選擇性強的條件放到最右邊,能夠先過濾掉大部分的數據(而選擇性不強的條件過濾後的結果集仍然很大),在根據其它條件過濾時,須要比較的數據量就少,提升查詢的效率。測試

當我看到這個邏輯時,自我認爲不是太合理,數據庫引擎在執行SQL語句時,都是要通過查詢優化器的,查詢優化器會將SQL進行優化,選擇最優的查詢計劃來執行,查詢優化器應該會選擇最優的查詢計劃,若是僅僅是由於where字句的順序不一樣,就不能選擇最優的查詢計劃,那麼查詢優化器得有多麼差勁啊...優化

實踐是檢驗真理的惟一標準

實驗條件:
新建表test_condition,主鍵爲id,還有兩列表示姓名的name和年齡的age,數據量爲10萬條,年齡是18-453d

單列的輔助索引

1. name列有索引

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

從二者的查詢計劃上來看,兩個沒有什麼區別。索引

2. name列有索引,age列有索引

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

多列的聯合索引

聯合索引<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遵循最左前綴原理,當查詢條件匹配聯合索引的前面幾列時,能夠使用聯合索引;不然,不會使用聯合索引。

以上結果均是本人一次測試的結果,僅供參考,若有不對,歡迎指正。

相關文章
相關標籤/搜索