mysql 查詢及更新,Mysql中哪些場景下會導(dǎo)致使用了索引但索引失效?
程序員應(yīng)該都知道,為了提高數(shù)據(jù)庫的查詢速度,我們可以對表上的一個字段或者多個字段建立索引,但是有些 SQL 錯誤的寫法,可能會導(dǎo)致索引失效。
01. 查看執(zhí)行計劃如何判斷 SQL 的執(zhí)行是做了全表掃描還是走了索引,不是憑感覺判斷 SQL 執(zhí)行的快慢,而是要看 SQL 的執(zhí)行計劃;很多工具都提供了查看執(zhí)行計劃的功能,不過最原始的方法,還是通過 explain 進(jìn)行查看;下面的 SQL,是否使用的索引,一目了然。
1. 沒有索引
explain select * from user where gender = 'M';2. 有索引
explain select * from user where name = 'Tom';02. 索引失效1. 使用 like 時,% 在前面不走索引(在后面可以走索引);
explain select * from user where name like '%om';2. 數(shù)據(jù)類型出現(xiàn)隱式轉(zhuǎn)化,比如我們這里手機號 mobile 字段設(shè)置的是 varchar 類型,但是查詢的時候用的是數(shù)字,那么就【可能】不走索引。
explain select * from user where mobile = 13800000000;3. 在索引字段上使用 not,<>,!= ;
explain select * from user where mobile <> '13800000000';explain select * from user where mobile != '13800000000';4. 對索引字段上使用函數(shù);
explain select * from user where length(mobile) < 105. 聯(lián)合索引,如果查詢條件不滿足最左匹配原則,則不會走索引;
6. or 會使索引失效,盡管 or 左右的條件都有索引;
explain select * from user where name = 'Tom' or mobile = '13800000000';總之,MySQL 的索引優(yōu)化和索引失效還是挺復(fù)雜的,主要體現(xiàn)在 MySQL 隨著版本升級,有一些我們熟知的技巧可能會不再正確,我們現(xiàn)在認(rèn)為一定會索引失效的 SQL 寫法,可能會變成走索引,所以這也是為什么我在上文中,多次用到【可能】會造成索引失效的原因。
我將持續(xù)分享Java開發(fā)、架構(gòu)設(shè)計、程序員職業(yè)發(fā)展等方面的見解,希望能得到你的關(guān)注。