MySQL 索引失效的場景

 

舉個例子,如我們有一張yesdk_orderlist 表,表中建立了索引的字段如下。

1.以%開頭的like 查詢語句不能利用B-tree 索引

explain select * from yesdk_orderlist where yesdkAppId like '%2018';

2.數據類型出現隱式轉換 (如果原數據類型是字符串,查詢條件使用了整型,則無法利用索引,反之可以,但不建議這麼做)

    2.1: explain select * from yesdk_orderlist where yesdkOrderId = 2018100

    2.2:explain select * from yesdk_orderlist where yesdkAppId = '2018100' 

 總結:當where 條件之後的類型和表結構定義的類型不一致的時候,MySQL會做隱式的類型轉換

第一種情況:如果表數據類型是字符串,查詢條件中使用了整型值去做查詢,則無法命中索引。(在這種情況下,兩個參數都被轉化爲浮點數再進行比較,但由於 ‘1’ ,‘    1’  ,‘1a’ ....)這樣的數字都會被轉化成1,故MySQL 無法使用索引只能進行全表掃描

第二種情況:由於索引是建立在int 的基礎上,而將純數字的字符串可以百分之百的轉化成數字,故可以用到索引,雖然也會進行一定的轉換,消耗一定的資源,但是最終任然會使用到索引。

3. 聯合索引下,查詢條件不滿足最左匹配原則,也不會走索引。

 能正常使用索引

 

查詢條件在索引的右邊,不遵循最左匹配原則,所以不會走索引

4.使用or 語句: or 後面的語句使用了非索引字段,整個SQL也將無法使用到索引

5.使用負向查詢(not ,not in, not like ,<> ,!= ,!> ,!< ) 不會使用索引

6.where 條件含有計算表達式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章