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查询条件一定要加引号
越知道你就越不知道,技术有限,理解有限,欢迎指正~
- 避免在sql的where中对字段进行转换(函数转换/操作符转换/隐式转换)------索引会失效从而导致慢查询
- MySQL隐式类型转换导致索引失效
- SQL中一些不经意隐式类型转换或者函数使用导致索引失效问题
- MySQL SQL优化之字符串索引隐式转换
- 由于mysql隐式类型转换导致的索引失效的问题
- mysql的jdbc中sql语句超时机制bug导致的内存泄露处理
- 无法将类型“string”隐式转换为“System.Data.SqlClient.SqlParameter”(错误)
- mysql 隐式转换问题
- 怎么将oracle的sql文件转换成mysql的sql文件
- MySQL性能优化:MySQL中的隐式转换造成的索引失效
- atitit。mssql sql server 转换mysql 及 分页sql ast的搭建
- Oracle PL/SQL之DDL导致的隐式提交
- MS SQL Server存储过程参数的隐式类型转换
- 也议MySQL中隐式转换
- sql优化之隐式转换
- MySQL的一条慢SQL查询导致整个网站宕机的解决方法
- MySql相同SQL、相同表、相同的索引、做关联连接的字符串型的字段的字符集不一致导致查询时间差别大...
- python json及mysql——读取json文件存sql、数据库日期类型转换、终端操纵mysql及python codecs读取大文件问题
- mysql5.6.16下跟踪SQL查询转换的结果
- C/C++隐式类型转换导致的若干问题