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秒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值