今天聽到一種說法牌废,說OR會使索引失效咽白,最好使用UNION代替。查了一下發(fā)現(xiàn)的確有些文章這么說鸟缕。但總覺得沒什么道理晶框。直覺上覺得雖然or連接的查詢條件不能使用聯(lián)合索引,但感覺兩個單獨的索引是可以用的懂从∈诙危看了一些文章,感覺一直很疑惑番甩。
于是試了一下侵贵,發(fā)現(xiàn)果然如此。
explain SELECT * from t WHERE id = 1 or uid = 2;
id | select_type | table | type | possible_keys | key | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|
1 | SIMPLE | t | index_merge | PRIMARY,uid | PRIMARY,uid | 2 | Using union(PRIMARY,uid); Using where |
這里的type項是index_merge缘薛。搜索后發(fā)現(xiàn)是MySQL5.0后的新技術(shù)窍育,索引合并。index merge 技術(shù)簡單說就是在用OR宴胧,AND連接的多個查詢條件時漱抓,可以分別使用前后查詢中的索引,然后將它們各自的結(jié)果合并交集或并集恕齐。當然具體是否使用index merge辽旋,優(yōu)化器會自己選擇,比如and連接時有聯(lián)合索引,或干脆全表查詢就很快补胚,就沒必要使用它了码耐。
具體可以查閱文檔:https://dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.html
還是很有意思的。
可能因為mysql這個東西太復雜溶其,感覺sql優(yōu)化都快成玄學了像棘。網(wǎng)上流傳了很多“奇技淫巧”晌砾,讓人真假難辨区匣。我覺得可能是過去mysql優(yōu)化不是很好時丽已,大家有一些優(yōu)化的技巧,但隨著mysql更新優(yōu)化厢绝,現(xiàn)在已經(jīng)成為過時甚至錯誤的做法契沫。但這些說法還在流傳,造成了我這樣的新手的困惑昔汉。
所以看來小白要學技術(shù)懈万,還是要踏實點多看官方文檔,多親自實踐靶病,少看博客会通,少道聽途說。