mysql中如果查询语句包含in并且参数中in的数量还比较多的情况下,一般不走索引。会造成查询慢的情况。一般情况下,in语句我们可以通过转化成连接语句,利用union all来优化查询:如下:
其中ids是个List
<select id="getXXXXX" resultType="XXXXX">
SELECT A.id,A.name FROM A
<if test='ids != null and ids.size() != 0'>
inner join
<foreach collection='ids' item='id' open='(' close=')' separator=' union all '>
select #{id} id
</foreach>
B on A.id=B.id
</if>
</select>
如果ids的数量还是特别多,union all 会造成sql长度超限。
上述原因下,想通过传字符串参数在mysql下通过拆分字符串,利用临时表来实现
<select id="getXXXXX" resultType="XXXXX"> create temporary table a_temp select #{ids} as name ; select A.id,A.name from A