天天看點

字元編碼,不走索引的元兇之一

引言

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.