字符校验集问题导致索引无法正常使用

今天一个开发人员找说咨询一个sql子查询问题:
sql类似如下:
explain select  col1,count(1) from  xxx  r where custuid>0 and xx=0 and xx in (xxx,xx)
   and exists (SELECT 1 from yyy sp where sp.col2=r.col2
LIMIT 1) group by col1;
两个表都不大,都不到十万,正常情况应该很快就能执行出结果,结果一直执行不动。

分析原因首先查看执行计划:

bb
可以看到内存表居然走了全索引扫描!

查看关联列col2上的索引情况,yyy上是单列唯一索引,理论上不可能走全索引扫描,
进一步查看表结构发现问题所在了:
原来两个表的col2字段虽然都是varchar,但是使用了不同的校验集:
一个是utf8_bin,另一个是默认的utf8_general_ci
校验集主要影响的就是字符串的排序比较场景。
正是这个原因导致关联列无法正常使用索引。
解决办法:两个表的字符集改成一致即可
alter table xxx modify col2 varchar(30)  COLLATE utf8_bin ;


查看执行计划:
bb
可以看到eq_ref,索引正常使用了。
尝试执行:0.02s


问题解决了,虽然很简单,但是比较隐蔽,前后花了快1小时才找到原因。
后续处理:
再次强调开发人员提交ddl的时候不要自定义字符校验规则(通常是没有这个需要的),dba在审核的时候也注意过滤这些信息。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20625855/viewspace-1696253/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/20625855/viewspace-1696253/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值