mysql索引失效之隐式类型转换

现网问题教训

之前有现网用户反馈说自己订单列表打不开了,页面数据无法加载出来。接到用户反馈,开发测试就立即排查起来了,可以看到是订单列表请求耗时较长被网关熔断了,所以导致页面数据无法加载,在查看用户账号下的订单数据,发现分页查询下,用户最近连续下单都是100个音频的订单,订单列表页面需要关联订单和音频表,还有一个订单记录表,而问题就出现在多表关联查询的时候,索引失效了,导致sql执行耗时较长,进而导致接口相应较慢,请求连接被网关熔断。

从跌倒处站起

mysql中的索引失效场景很多,比如说like模糊查询、in查询中子集太多,这些都会导致查询索引失效,这里来和大家一起学习下隐式类型转换导致的索引失效,也许你会说,mysql不是已经支持隐式转换了吗?比如现在有个整型的user_id索引字段,我们因为查询的时候没注意,写成了:

select xx from user where user_id="1234"

注意这里是字符的1234,当发生这种情况下,MySQL确实足够聪明,会把字符的1234转成数字的1234,然后愉快的使用了user_id索引。但是如果我们有个字符型的user_id索引字段,还是因为我们查询的时候没注意,写成了:

select xx from user where user_id=1234

这时候就有问题了,会用不到索引,也许你会问,这时MySQL为什么不会转换了,把数字的1234转成字符型的1234不就行了?这里需要解释下转换的规则了,当出现字符串和数字比较的时候,要记住:MySQL会把字符串转换成数字。也许你又会问:为什么把字符型user_id字段转换成数字就用不到索引了? 这又要说到B+树索引的结构了,我们知道B+树的索引是按照索引的值来分叉和排序的,当我们把索引字段发生类型转换时会发生值的变化,比如原来是A值,如果执行整型转换可能会对应一个B值(int(A)=B),这时这颗索引树就不能用了,因为索引树是按照A来构造的,不是B,所以会用不到索引。

简而言之

mysql在字符串和数字类型转换时,是由字符串转到数字,如果在字符串字段上建立索引,由字符串转换成数字时,索引就会失效。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值