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


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

  • 相关阅读:
    数据结构----线性表之栈
    三维地图开发平台-支持离线地图开发
    Linux网络编程(三)
    JWT(令牌)
    python PyQt5(自定义)信号与槽详解与实例
    【算法笔记】PTA1046 划拳 分数 15 1008 数组元素循环右移问题 20
    数据中台的前世今生(一):数据仓库——数据应用需求的涌现
    Go语言中实现应用IP防火墙
    c++实现简单股票买入和撤销功能(demo)
    Mysql 单行处理函数打字练习—— 让你熟悉必要的函数,提高查询效率
  • 原文地址:https://blog.csdn.net/zyjzyjjyzjyz/article/details/134497244