记录一次使用Mysql前缀索引优化过程

问题描述:

我现在有两张表,一张业务表 rk_newpeople_subsingle,一张手机号码加密记录表rk_mobiletel_encrpt数据量在9万多条。现在我要查询rk_newpeople_subsingle中的手机号原文,sql语句如下:

explain select (select rme.mobiletelval from rk_mobiletel_encrpt rme where rme.mobiletelencrpt=rns.TEL) as tel from rk_newpeople_subsingle rns where `Type` ='02' and Status ='01' and yearflag ='2023';

执行结果:

查询时长在1m30s ,尝试对mobiletelencrpt字段加索引后发现无效,用不到索引,猜测是因为用索引查询的效率还不如全表查询效率,所以没用到索引。

解决办法

想到了建立前缀索引来优化:

执行:

SELECT COUNT(DISTINCT mobiletelencrpt) / COUNT(*) FROM rk_mobiletel_encrpt;

结果为1,说明字段不重复

执行:

SELECT COUNT(DISTINCT LEFT(mobiletelencrpt, 6)) / COUNT(*) FROM rk_mobiletel_encrpt;

结果为1,说明mobiletelencrpt的前6位就可以区分唯一值了。

这里的6是从1开始一步步试出来的。

好了,建立前缀索引:

alter table rk_mobiletel_encrpt add index mobiletelencrpt_index(mobiletelencrpt(6));

看下效果:

 可以用到索引了,看下查询效率:

 只有59ms了

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值