IN not in exist not exist
基礎知識:
ALL 全表掃描,對整個表進行掃描,效率最差;
Index 索引掃描,是對整個索引的掃描,如果查詢的選擇結果中沒有包含在索引中時,那跟全表掃描的效果時一樣的;
Range 有范圍的索引掃描;
Ref 查詢條件的列中使用了索引,但是索引不是唯一的,所以需要繼續在該范圍內查詢,但是因為索引時有序的,所以只是在小范圍內的查詢;
Const 常量查詢,直接通過主鍵值等值查詢;
這幾個判斷究竟走不走索引呢?
目前大部分說的是in 在某種情況下會出現索引失效;not in <>都不會走索引;其實也對也不對;
在mysql中如果脫離的搜索引擎的版本去看問題就不好判斷了。
In 在5.7以前,如果是小范圍的查詢,還是走索引的,type屬於range,在隨着數據量的增大時會自動進行全表的掃描(並且與要查詢的結果是否包含在索引樹中決定走index還是all);not in則不走索引;
目前在8.0以后驗證,發現無論是in not 或者<>,都會走索引;
問題辯證看,in的優化也得結合具體的業務場景,優化的方式時可供選擇的途徑,沒有孰優孰劣;