引言
2021年春節後的某個忙(mo)碌(yu)的下午,旁邊的劉哥(老江湖,從業5年+)突然發出了一聲歎息:“哎,mysql 出bug了,有索引不走”。
作為一個熱心的人,我立即說到:“是不是,對索引字段做了函數操作”。
劉哥沉思了2秒,略有玩味的小眼神看了看我,慢慢說道:“溫兄,正常的情況,對索引字段做函數操作,或者 字元串與數字比較造成的隐式轉換,這次的SQL都不涉及”。
我一聽頓時來了興趣,略帶興奮的跟劉哥說:“劉哥,您發SQL,我也研究下”。
劉哥略有無奈的看了看我後,依舊把SQL發給了我:
不過須臾(近20分鐘),我便查明了原因,裝作大師的模樣,一字一句的說到:”這是,字元集隐式轉換問題”
劉哥聽後,百度了下,直拍大腿,“對對,怎麼把這個給忘了”。
定位問題

确實被驅動表orders_detail 沒走索引
第一個表就是驅動表,後邊的都是被驅動表,會從驅動闆取出資料作為參數,到被驅動表查詢比對的記錄。 --- 非專業術語,溫安适 20210223
utf8m4是utf8超集,utf8,與utf8mb4會比較,utf8會轉換為utf8mb4.
調整SQL語句,将oc_orders的order_id強制轉換為utf8。
檢視執行計劃,确實走了索引
解決方式
總結
可能不走索引的3種情況
對索引字段做函數操作
隐式類型轉換,字元串與數字比較,字元串會轉換為數字
隐式字元集轉換,utf8m4是utf8超集,utf8,與utf8mb4會比較,utf8會轉換為utf8mb4.