今天帮同事处理了一个bug,有个sql语句后端执行耗时6000多毫秒,在navicat中执行只需200毫秒,速度相差30倍。项目后端mybatis,数据库pgsql。
结合网上的资料和自己的经验,实验了三种方法:
1、mybatis参数连接符#换成$
结果有效,但有sql注入风险,代码审查不通过。
2、mybatis参数固定数据类型
如#{startTime}改为#{startTime,jdbcType=DATE}
结果无效。
3、调整where条件顺序
最后利用sql调优的思路,试着换了一下where条件的先后顺序,将能够最大过滤数据的条件从最右边挪到最左边,结果完美。
虽然问题解决,但还是有疑惑,根据我这个老码农的经验,where条件的执行顺序,不是从右往左执行吗?啥候成从左往右执行了?带着疑惑,我又查了下资料,恍然大悟:
oracle数据库where条件执行顺序是从右往左。
mysql、pgsql数据库where条件执行顺序是从左往右。
因为我16年前开始工作时数据库基本是oracle天下,习惯了where从右往左的调优,久而久之,潜意识认为数据库都是从右往左了,犯了经验主义的错误啊。
标签:顺序,数据库,30,Navicat,sql,mybatis,执行,where From: https://blog.csdn.net/wuqingliang510/article/details/136757846