mysql 中的隐式转换导致sql变慢

mysql 中的隐式转换导致sql变慢

1、场景

线上跑了一个慢sql,查看表结构,表里面有order_no的唯一索引
在这里插入图片描述
此处注意mysql查询隐式转换的导致问题,当查询条件左右两侧类型不匹配是,就会发生隐式转换,导致索引无法起作用

2、举例

库里有一张表,有字段order_no(varchar),final_amount(decinal):
在这里插入图片描述
分别有唯一索引order_no和正常索引final_amount在这里插入图片描述
我们使用: explain select * from orders where order_no = ‘20190324030381’
在这里插入图片描述
从执行计划中可以看出sql走了索引,当我们使用:explain select * from orders where order_no = 20190324030381
在这里插入图片描述
可以看到当我们没有使用引号时,sql进行的是全表检索

使用:explain select * from orders where final_amount > 1000
在这里插入图片描述
sql走索引

使用: explain select * from orders where final_amount > ‘1000’
在这里插入图片描述
同样走了索引

3、总结

当字段等号两侧类型不一致,会发生隐式转换,cast(index_filed as signed),然后和字段对比。当字段varchar时,我们查询20190324030381,字段varchar转化为int,再与20190324030381比较,那么库里’20190324030381’,‘a20190324030381’,‘20190324030381a’ 均可转化成20190324030381,那么表就无法使用索引,只能全表转化检索。对于int型,发生隐性转化时,有int转化为varchar,1000只会转化成’1000’,所以可以走索引

4、拓展

延伸的拓展验证了dateTime,使用:explain select * from orders where complete_at > ‘2020-05-25’
在这里插入图片描述
走了索引,使用:explain select * from orders where complete_at > 2020-05-25
在这里插入图片描述
没有走索引,而且感受下运行速度
在这里插入图片描述
在这里插入图片描述
这不是慢了一点点啊,所以查询的时候一定谨记,对于varchar、dateTime查询条件一定要加引号

越知道你就越不知道,技术有限,理解有限,欢迎指正~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值