MySQL不走索引的情況


1.索引列參與了計算,不走索引!

  不走索引情況:SELECT `username` FROM `t_user` WHERE age+10=30;

  走索引情況,因為沒有在列上運算:SELECT `username` FROM `t_user` WHERE age=30-10;

2.索引列上使用了函數,不走索引!

  不走索引情況:SELECT username FROM t_user WHERE concat(username,'1') ='admin1';

  走索引情況,因為沒有在列上使用函數:SELECT username FROM t_user WHERE username =concat('admin','1');

3.索引列使用了Like %XXX或Like %XXX%,不走索引!

  不走索引情況:select * from user where username like '%mysql測試'    select * from user where username like '%mysql測試%'

  走索引情況: select * from user where username like 'mysql測試%' ;

4.隱式轉換——字符串列與數字比較,不走索引!

  title字段為varchar

  不走索引情況:select * from job j where j.`title` = 1

  走索引情況,因為比較的是字符:select * from job j where j.`title` = '1'

5.盡量避免 OR 操作,只要有一個字段沒有索引,改語句就不走索引,不走索引!

  select * from t_user where username = 'mysql測試' or password ='123456'

  當只有username有索引,則不走索引。

  當username和password都有索引,則走索引。

6.使用!= 或者 <> 判斷,不走索引!(<>是!=另一種表達形式,其效果都相同)

  不走索引情況:select * from t_user where username <> 'mysql測試'

         select * from t_user where username != 'mysql測試'

7.where中使用 is null,is not null也無法使用索引,不走索引!

  不走索引情況:select from t_user where username is null

         select from t_user where username is not null

8.不符合最左匹配原則的符合索引寫法,不走索引!

  最左匹配原則:

    當遇到范圍查詢(>、<、between、like)就會停止匹配

    在 InnoDB 中聯合索引只有先確定了前一個(左側的值)后,才能確定下一個值。如果其中一個沒有連續匹配上,那么聯合索引中使用范圍查詢的字段后的索引在該條 sql 中都不會起作用。

    in= 都可以亂序,比如有索引(a,b,c),語句 select * from t where c =1 and a=1 and b=1,這樣的語句也可以用到最左匹配,因為 mysql 中有一個優化器,他會分析 SQL 語句,將其優化成索引可以匹配的形式,即

select * from t where a =1 and a=1 and c=1

  例如定義了符合索引(a,b,c)

  走索引的情況:select * from t where a=1 and b=1 and c =1;(全部匹配,走索引)

         select from where c=and b=and a =1; (MySQL server層優化器會幫我們自動優化為 a,b,c,全部匹配,走索引)

         select * from t where a=1 and b=1;(匹配到前綴a,b,走索引)

         select * from t where a=1;(匹配到前綴a,走索引)

  不走索引的情況:select * from t where b=1 and c=1;(沒匹配到a,碰到了b和c 結束匹配)

          select * from t where a=1 and c=1;(匹配到a后沒有匹配到b卻碰到了c 結束匹配)

          select from where a=and b>and c =1; (a,b用到了復合索引,c沒有)

 

最后值得一提的是有時候我們的正常使用的大於>,小於<都不會走索引,這跟數據大小和數據存儲空間位置與索引位置有關系,有時候我們MySQL優化器會進行擇優選擇,來選擇走索引還是直接去引擎尋找數據,我們需要做的就是避免以上語法情況。

          


免責聲明!

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



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