MySql變動表字符集致使索引失效

以前工做過程當中,有一次發佈後,查詢某個後臺頁面,一直報系統異常,查詢日誌發下是由於查詢一個sql超時 mysql

生產上查看sql執行計劃發現sql關聯的o2o_v_video_review、o2o_v_guide_info表未走索引致使全表掃描,從而執行時間過長sql

表o2o_v_video_review和表o2o_v_guide_info經過字段guide_id關聯,因爲發佈時o2o_v_video_review該表整表的字符集改成utf8mb4_general_ci,使得guide_id字段與o2o_v_guide_info的guide_id字符集不一致。ide

o2o_v_video_review與o2o_v_guide_info字符集不一致,在關聯查詢時,mysql內部先把 utf8 字符串轉成 utf8mb4 字符集,再作比較(utf8mb4 是 utf8 的超集),至關於對索引字段guide_id字段作了CONVERT()函數轉換,所以該索引失效。函數

解決:當晚發佈sql腳本將o2o_v_video_review表的字符集改成o2o_v_guide_info的字符集,保持2張表的字符集一致ui

總結:多表關聯查詢時,不只要保證關聯的字段有索引,並且要保證多張表的字符集要一致,不然mysql內部會作隱式轉換,致使索引失效!!日誌

相關文章
相關標籤/搜索