in数据太多导致查询延迟
工作上跨服务调用传递的id数组 然后根据数组里的id 去in 一个表。618的时候发现查询老是超时。然后我这边准备优化
对象入参变成临时表的方法
一开始是想着把对象变成一个临时表 通过jion 连接去查询。
找了一下发现可以用select 1,2,3 …这种该方法
sql 的 select 可以指定常量,包括对象里面的数据。根据 mybatis 语法可以直接select #{字段名1} as amount,#{字段名2} as store_code 就可以转换这个对*象,
代码实例
/**
*sql 的 select 可以指定常量,当然就包括对象里面的数据。所以根据 mybatis 语法我们*可以直接select #{字段名1} as amount,#{字段名2} as store_code 就可以转换这个对*象,
*/
SELECT * FROM tb_product p LEFT JOIN (
SELECT #{num} as a , #{age} as b
)ab ON p.product_id = ab.a
数组入参变成临时表的方法
sql语法中有个union这个操作,可以用union可以连多行数据,就像这样:
select 10 as a, 30 as b
union
select 20 as a ,40 as b
mybatis中可以用foreach 。这种方式的数据量也是在一个定值才不慢
SELECT
*
FROM tb_product p
LEFT JOIN (
<foreach collection="productIdList" item="productId" index="index" separator="union">
SELECT
#{productId.num} as a,
#{productId.age} as b
</foreach>
)ab ON p.product_id = ab.a
in方式可以改成多查询
- mysql in 超过 300 个,性能就会严重下降。 建议,先写临时表,再关联查询
- 可以拆分成多个list 多次查询比一次查询性能要快