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


看到有資料說,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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM