mysql隐式转换导致索引失效

1、如果你的表字段类型是字符串类型,比如varchar,并且该字段上有索引,如果你查询的时候用的是数值,则会导致索引失效,比如表里存的是:

字段user_id
111
类型varchar(100)

如果你的查询是select * from xxx where user_id=111,则索引失败;  select * from xxx where user_id="111"才会用上索引。

因为mysql会在背后进行类型隐式转换(CONVERT_IMPLICIT),会把user_id隐式转换成浮点数,然后再跟你的111进行比较,然而你的索引是建在user_id上的,并不是在转换后的user_id上的,所以转换后的user_id上是没有索引的,会有效率问题。

再者,mysql的隐式转换string到number会有很多情况,比如"111"," 111","111a"都会转成111,case太多。

 

2、但如果你的表字段是数值类型则没关系,都会用到索引。

因为int再怎么转string都是固定的,不会出现像string转int的那么多case。

 

文档里说了一句『In all other cases, the arguments are compared as floating-point (real) numbers. For example, a comparison of string and numeric operands takes places as a comparison of floating-point numbers.

如果比较的两边是字符串和数字,则都会按浮点数进行比较。啥意思呢?

对于问题1,我们是user_id是varchar类型,值是int类型,这俩比的时候会把所有的varchar记录都转化成数字进行比较,

对于问题2,我们的user_id是int类型,值是string类型,这俩比的时候只会把值进行数字化,然后与记录中的数字进行比较,所以永远都会用到索引。

场景:https://makandracards.com/makandra/14955-mysql-will-not-use-indexes-if-you-query-the-wrong-data-type

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值