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


    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'转换成数值类型相同,这样除了会导致查询结果错误还会导致索引失效。

  • 相关阅读:
    KingbaseES数据库 kdb_schedule 自动定时任务
    前端权限管理(完成流程细致到按钮)
    uniapp前端对数据的处理
    浅理解java中的泛型
    ASCII码与字符对照表(附转换代码)
    自学Python 49 正则表达式(一)基本语法表达
    moviepy第一天|模糊视频中卓别林的头,并添加一个文本生成的结尾clip,同时保留音频
    Spring - Spring Cloud Gateway网关实战及原理解析
    如何使用 GTX750 或 1050 显卡安装 CUDA11+
    算法学习day02(链表/哈希表/字符串)
  • 原文地址:https://blog.csdn.net/zyjzyjjyzjyz/article/details/134497244