Mysql sql優化案例之表關聯字段字符集不同導致被驅動表無法走索引

一 問題描述

發現生產有這樣一個慢查詢:

SELECT

  t.*,

  u.user_truename AS username

FROM

  cms_template_flow t

  LEFT JOIN sys_user u

    ON t.create_user_id = u.user_id

WHERE t.wid = 'WS598636079746125824'

  AND t.is_published = 1

ORDER BY t.sortnum DESC

查詢需要執行3秒,比較慢。

sys_user有40多萬條數據,cms_template_flow只有60條數據。

執行計劃如下:

 

sys_user表的user_id是有建索引的,可是這裏卻走了全表掃描。

二 排查思路

查看下這兩個關聯表關聯字段的數據類型是否一致,字符集是否一致,collate是否一致

經查看,字符集不一致:

cms_template_flow表的字符集是utf8mb4,sys_user表的字符集是utf8,且這倆表各字段的字符集都未單獨設置,因此和其所在表的默認字符集是一樣的。

cms_template_flow列create_user_id的字符集是utf8mb4,和sys_user列user_id的字符集(utf8)不一致,導致無法走索引,會多次全表掃描sys_user,性能較差。

三 解決辦法

修改其中一個的字符集,和另外一個保持一致。
這裏將cms_template_flow列create_user_id的字符集修改爲utf8:
ALTER TABLE cms_template_flow CHANGE create_user_id create_user_id VARCHAR(50) CHARACTER SET  utf8 DEFAULT NULL COMMENT '添加人';

執行時間從3秒變成了0.02秒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章