以前工做过程当中,有一次发布后,查询某个后台页面,一直报系统异常,查询日志发下是由于查询一个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内部会作隐式转换,致使索引失效!!日志