mysql索引 (校验规则引发的血案)

 

EXPLAIN SELECT a.* FROM gc_fin_rate_info  a LEFT JOIN rbac_user b ON a.owner =b.id;

处理之前的情况。

虽然走了索引,但是type不为ref。分析表的字符集及校验规则

 

两张表的字符集、引擎、核对规则都是一样的,就是不走索引

翻阅资料发现,mysql的字段也有校对规则,两个字符串比较,要求必须有相同的校对规则,或者是相容的,及左连的表的校对规则的级别高于主表,mysql的校对规则默认有utf8_bin(最高,以二进制的形式对编码进行比较),utf8_general_cs(区分大小写),utf8_general_ci(不区分大小写),如果left join左右两边的级别一样或者右边的级别高于左边的会走索引。

用show create table gc_fin_rate_info  ,rbac_user 查看关联的字段的属性,

CREATE TABLE `gc_fin_rate_info` (
`owner` CHAR(20) COLLATE utf8_bin NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

CREATE TABLE `rbac_user` (
`id` CHAR(20) CHARACTER SET utf8 NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

发现rbac_user的id没有校对规则,即级别小于主表的字段。所以不走索引

修改级别即可

ALTER TABLE rbac_user MODIFY id CHAR(20)  CHARACTER SET utf8  COLLATE utf8_bin NOT NULL;

 

转载于:https://www.cnblogs.com/weizhenlu/p/5981635.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值