舉個例子,如我們有一張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 條件含有計算表達式