今天在写业务的时候,碰到一个SQL提速的问题,刚开始的时候一条条的update,那个速度慢到我吐血,上批量。
但是在批量的时候不是简单无脑根据一个条件去update全部(那这样的话,慢个屁啊)。每次update都要判断条件,例如简单的都是对应每个ID。可能我太菜了,竟然一时之间不知道怎么写了。再次留下了没有技术的泪水。不怕,我是有度娘和Google的孩子。然后找到了方法记录一下。
解决办法就是说使用case when。
语法就是:
update table set field=
case field1
when a then b
when c then d
end,
field2 =
case field1
when a then e
when c then f
where field1 in (a,c);
这样就可以根据条件去update了
当然啦,mybatis怎么写呢,我习惯用注解,简单,直接。所以也贴一下mybatis注解的写法吧,这里用到了script 里面的for循环,不会的可以自己学习一下哦,不过我觉得这个一眼就会啦
@Update({"<script>",
"update <table> set <field> = CASE <field1> ",
"<foreach collection='lst' item='task' index='index' separator=''>",
"WHEN #{task.<field1>} THEN #{task.<field>}",
"</foreach>",
"END, ",
"<field2> = CASE <field1> ",
"<foreach collection='lst' item='task' index='index' separator=''>",
"WHEN #{task.<field1>} THEN #{task.<field2>}",
"</foreach>",
"END where <field1> in (${ids});",
"</script>"
})
void updateCrmBatch(@Param("lst") List<Object> lst,@Param("ids") String ids);
ok,打完收工,我波哥说我懒惰了,看起我要勤奋才行啊~加油~~~~