mysql left join影响索引_mysql left join没有使用索引原因排查。

问题:

项目使用Activiti进行工单业务开发时 ,将历史任务实例表( act_hi_taskinst )和催单记录表(tbl_urgency_recd)进行left join关联开发时,发现已经建了索引,但是执行计划里显示没有使用索引。

原因:

所有的关联的字段的字符集不一样,导致无法使用索引。

具体过程如下:

SQL的执行计划:

0bd0227f9bfaa925336a3a35e443e39f.png

Extra列,Range checked for each record (index map: 0x2)的意思为没有合适的索引可用。以下为《高性能MySQL》一书的解释:

92d6c87db40b5b203862c499e2f4079a.png

但是,两个表对应的字段都是建有索引:

act_hi_taskinst:

f610ed329e002e0a34f98a10e4015489.png

tbl_urgency_recd:

ec3368c68ba1960c977d39ad996fa600.png

查看两个表的字段属性:

tbl_urgency_recd:

2324517a0fc24427efc66b4613f5b635.png

act_hi_taskinst:

8545adbd526434c2fd88af9286a46016.png

tbl_urgency_recd表字段task_id字符集为:utf8_general_ci。

act_hi_taskinst表字段ID_的字符集为:utf8_bin。

将tbl_urgency_recd表字段task_id字符集修改为:utf8_bin。

8474a30d91cdc27e256bf8de34b26844.png

修改完,再执行explain,结果入下。

298baa55cc51115f292f045d6934a0bd.png

显示,已使用索引,关联类型(type)由ALL(全表扫秒)变为ref(索引访问)。

另外,在这记录下mysql的常见字符集区别,用以备查:

utf8_bin将字符串中的每个字符用二进制数据存储,区分大小写。

utf8_genera_ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感,为utf8默认编码。

utf8_general_cs区分大小写,cs为case sensitive的缩写,即大小写敏感。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值