mysql datetime month不走索引_like百分号加前面一定不走索引吗?一不小心就翻车,关于mysql索引那些容易错的点...
like百分號加前面一定不走索引嗎?
正常來講,我們都知道在mysql的like查詢中,百分號加在關鍵詞后面是走索引的,比如 select * like "張三%",而百分號在前面是不走索引的,比如 select * like "%張三",但也有例外。如果你的字段有id,a,b,c四列。而你對abc三列加了索引的話。那無論如何,like都會走索引的。因為如果能走覆蓋索引的話。mysql會優先走覆蓋索引。
同時,如果id,a,b,c四列,僅對a列做了索引,select a from table where a like "%張三%"也同樣是會走覆蓋索引的
like如果走了索引,或者范圍查詢后面的字段還走不走索引?
假設abc加了索引,select a from table where a like "張三%" and b = 18,那b走不走索引?不一定,根據索引的底層原理,a字段是確定值,b字段才會走索引。所以范圍查詢后面不走索引只是一個偷懶的說法。如果范圍查詢過后的a是個確定值,那后面還是走索引的,否則不走
abc創建了索引,where條件和索引順序不一致走不走索引?
abc創建了索引,select * from table where a = 1 and c = 3 and b = 2 走不走索引?走的,mysql底層會針對sql語句進行一定的優化。該sql幾個and的順序調整對最終結果的正確性沒有影響,但卻會走不走索引的查詢效率影響較大。sql很樂意做這樣的優化
or走不走索引?
我們經常會聽到or走索引,或者or不走索引的簡單說法,其實這里是分情況的
如果針對某個字段的or是走索引的,比如 select * from table where ( a = '3' or a = '4') ;
如果針對多個字段的or是不走索引的,比如 select * from table where ( a = '3' or b = 4) ;
排序走不走索引?
select * from table where a = '張三' and b = 18 order by c asc,排序字段c走不走索引?走的!
abc正好順序的出現在組合索引當中,但有個點要注意的是,如何知道排序走沒走索引。一般走沒走索引通過explain當中的key能看出來。但在剛才的sql中,由于a已經走了索引,c走不走索引無法通過key看出來,而只能通過extra中的信息來看,如果extra出現了filesort說明沒有用到索引。
引申一下,和c的場景類似,如果知道b走沒有索引。只能通過和單獨a條件,比較key_len來確定,如果b走了索引,key_len是會變長的。否則沒走
提防隱式轉換
有一種比較低級錯誤,比如我有個字段名a,保存內容為年齡,但是誤用了varchar字段,那 select a from table where a = 18,走不走索引?不走的,雖然mysql很智能,這個sql沒有報錯,但是mysql為此針對列a做了字符串到數字的轉換,我們都知道一旦針對某個字段做了函數轉換,那就不走索引了。再引申一下,索引失效以后 update table set b = 10086 where a = 18,由于索引失效,針對a的查詢需要全表掃描,針對a的修改又需要加寫鎖。所以本來的行級寫鎖變為了表級寫鎖。并發能力大大降低!
總結
以上是生活随笔為你收集整理的mysql datetime month不走索引_like百分号加前面一定不走索引吗?一不小心就翻车,关于mysql索引那些容易错的点...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HPWuSchd2.exe是什么进程 作
- 下一篇: mysql_fetch_bit_mysq