隐式转换导致索引失效的原因

Num1 int

Num2 varchar

Str1不能为null

Str2可null

例子1:

结果:124非常快,0.001~0.005秒出结果。3最慢,4~5秒出结果。

查询执行计划:124索引扫描。3全表扫描。

解释:首先四个23都产生隐式转换,隐式转换就是将大范围转换成小范围(大类型转换为小类型)

此例子就是将字符类型转换为数字类型

转换规则:

不以数字开头的字符串都转换成0

以数字开头的都进行截取,从第一个字符截取到第一个非数字内容为止。比如'123abc'会转换为123,'012abc'会转换为012也就是12,'5.3a66b78c'会转换为5.3,其他同理。

例子2:

 

总结:

  1. 当操作符左右两边的数据类型不一致时,会发生隐式转换
  2. 当where查询操作符左边为数值类型时发生了隐式转换,那么对效率影响不大,但还是不推荐这么做。
  3. 当where查询操作符左边为字符类型时发生了隐式转换,那么会导致索引失效,造成全表扫描效率极低。
  4. 字符串转换为数值类型时,非数字开头的字符串会转化为0,以数字开头的字符串会截取从第一个字符到第一个非数字内容为止的值为转化结果。

所以,我们在写SQL时一定要养成良好的习惯,查询的字段是什么类型,等号右边的条件就写成对应的类型。特别当查询的字段是字符串时,等号右边的条件一定要用引号引起来标明这是一个字符串,否则会造成索引失效触发全表扫描。

隐式转换不一定都导致索引失效,比如左面是数值类型,右边的字符就会转换成数值类型,不会导致索引失效。

隐式转换导致索引失效的原因:

比如左面是字符型,右边是数值型,字符转换成数值,而字符容易产生歧义,比如'10000f'和'10000'转换成数值类型相同,这样除了会导致查询结果错误还会导致索引失效。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值