都知道#{}是以占位符的形式${}是直接拼接sql的形式
情况说明:我在mybatis中数字字符串查询数据是我在navicate中执行sql慢了一倍,经过多次尝试发现mybatis传入数字字符串时和直接执行sql条件是and xxx=331的执行时间一样,而用and xxx='331'查询则要快了一倍
也就是说当我传递的参数是数字字符串时,我在mapper中这样写‘${xxx}’的结果比#{xxx}快了一倍,希望有大神给与指引
--我是两张表连接查询,根据ksno字段建立的连接,不加索引时他是表连接慢,当我给ksno添加上非聚集性索引时,查询很快,但是我不加索引时为什么传递数字字符串时用#{xxx}和在数据库中执行and xxx=331的时间是一样的,而比and xxx='331'慢了一倍
下面是我的情况:
环境:springboot+mybatis,
mappper中写法如下,传递参数的类型是map,
<if test="ksallstatuszkzpzl != null and ksallstatuszkzpzl !=''">
and tjksallstatus.zk_zpzlcode=#{ksallstatuszkzpzl,jdbcType=VARCHAR}
</if>
java代码中写法如下,其中ksallstatusspzpzl是字符串类型
if(StringUtils.isNotEmpty(ksallstatuszkzpzl) ){
paras.put("ksallstatuszkzpzl",ksallstatuszkzpzl);
}
在不加索引,数据量为100w条,查出的总数也是100w条,传入参数值为字符串’331‘的情况下(数据库中字段zk_zpzlcode为varchar类型)
mybatis执行时间12秒,直接执行sql只需6秒
在经过多种情况下的尝试发现mybatis执行的sql为占位符的形式
AND tjksallstatus.zk_zpzlcode =?,传地参数为打印出为:
2019-08-10 09:15:00.103 [http-nio-8080-exec-4] DEBUG com.zr.dao.KsxxMapper.selectAllStatusByKsxx_page - ==> Parameters: 331(String)
发现此种执行结果所需时间和直接执行sql,AND tjksallstatus.zk_zpzlcode =331执行的时间一样都是12秒
而直接执行sql,AND tjksallstatus.zk_zpzlcode =‘331’所需时间只需6秒
由此猜想mybatis把我传递的字符串331按照数字331到数据库中做了比较
如果mapper中这样写
<if test="ksallstatuszkzpzl != null and ksallstatuszkzpzl !=''">
and tjksallstatus.zk_zpzlcode=#{ksallstatuszkzpzl,jdbcType=VARCHAR}
</if>
所需时间是6秒
由此肯定了我的猜想,
那么如果比较名字,我在比较名字的时候输入331他会不会页按照数字比较呢,比较身份证号是不是也是按照数字比较呢?
希望大神给与指导,这是不是mybatis的锅
--我是两张表连接查询,根据ksno字段建立的连接,不加索引时他是表连接慢,当我给ksno添加上非聚集性索引时,查询很快,但是我不加索引时为什么传递数字字符串时用#{xxx}和在数据库中执行and xxx=331的时间是一样的,而比and xxx='331'慢了一倍