最近遇到关于mybatis中#与$的一个坑

大多数开发同学比较清楚MyBatis/Ibatis中#$的区别,#方式能够很大程度防止sql注入,$方式无法防止Sql注入。所以,老同学对新同学说,最好用#

有些特例是需要关注的,有的时候需要用$解决一些实际问题。

最近遇到的一个例子是,表里的数据大概有6000多万,都是城市A的数据,因为公司扩张到了B城市,为了区分,最快的方式在在关联查询的时候加上一个#{cityName},实际运行后,某一个时间数据库cpu飙高、查询超时。

为什么呢,注意一个关键点,A城市的数据6000多万,B城市新加入的每天才产生几万的数据量。在根据cityName = #{cityName}做查询的时候,数据库有个预编译的过程,会统计信息来判断什么连接方式,如果刚好查询B城市做了预编译,执行计划根据统计信息,发现cityName的变量B的情况下,会选择不同的表连接方式,嵌套循环或者其他连接方式,比如排序连接、哈希连接、索引连接等等。不同的统计信息。产生的预编译就不一样。

临时解决方案的其中一个是是用'cityName = ${cityName}',用字符串拼接的方式,预编译就不会当作变量来干了,忽略了cityName的统计信息。得到的执行方式将会比较好。

响应的,在这样的表的查询中,比如6000多万的数据,有业务需要查询今天的,本周的数据,也需要注意不要把时间带入变量,让统计信息给查询误导。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值