foreach 后面in 传入的参数有1万条,#和$是有效率区别的,$的效率远高于#,上篇文章做了比较。

但没达到我的理想结果。

1. 更改方式,把foreach 去掉,改成拼装方式, 参数直接拼装成 ‘1,2,3,4,5,6’ ,然后传入mybatis 中,dev_id in ${devIds},这里只能用$, 不能用#,#加了引号,实际

到数据库的SQL 是  dev_id in ('1,2,3,4,5,6') 而不是 dev_id in (1,2,3,4,5,6) ,所以查不到结果。但是更改成这样,仍然比foreach的$ 提升一倍的时间,不理想。

2. 继续更改方式,换成exists, 这货和in 在主表数据和子表数据一样多的情况,实际效率差不多,只有当主表数据比子表数据多,用in快,主表数据比子表数据少,用exists, 实际上我这里不是数据库的瓶颈,把这条SQL传入1万条ID作为参数在客户端的工具里查询,花费也就100毫秒左右。所以,我打算用exists试一试。

<if test="devIds != null and devIds != ''">
and EXISTS (select 1 from
(SELECT regexp_split_to_table(#{devIds},',') AS dev_id) AS vir where cast(vir.dev_id as BIGINT) = sd.id)
</if>

把送来的devIds 字符串进行行转列,然后进行exists, 我这里dev_id字段类型为BIGINT,数据库为Postgresql。我把数据库的数据由1万改为100万条数据,传入的参数由1万改成20万,in 消耗的时间如下图的cost1, 373秒:

exists 消耗的时间如下图cost1 , 2秒不到:

这样,就算是解决了in的效率问题。我们系统达不到100万级别的数量级,可能最多就10万。足矣

mybatis中foreach参数过多效率很慢的优化的更多相关文章

  1. mybatis中foreach的用法(转)

    foreach一共有三种类型,分别为List,[](array),Map三种. foreach属性 属性 描述 item 循环体中的具体对象.支持属性的点路径访问,如item.age,item.inf ...

  2. mybatis中String参数的传递

    mybatis中String参数的传递 Keywords selectKeywords(@Param("key") String key); 可以在mapper方法的参数钱添加 @ ...

  3. mvc中多参数URL会很长,首次加载不传参数让url很短,路由规则实现方法[bubuko.com]

    如要实现列表中地址全路径“bubuko-11-2.html”,在首次进入时,使用短路径“bubuko.html”,只有再次href后才显示全路径“bubuko-11-2.html”,下面使用路由规则来 ...

  4. MyBatis中传入参数parameterType类型详解

    前言 Mybatis的Mapper文件中的select.insert.update.delete元素中有一个parameterType属性,用于对应的mapper接口方法接受的参数类型.本文主要给大家 ...

  5. mybatis 中 foreach 的性能问题及调优

    1.mybatis中最初的sql语句 SELECT 参数1, 参数2, 参数3 FROM 表 WHERE 条件参数1 in <foreach item="item" inde ...

  6. mybatis中foreach使用

    mybatis中的<foreach collection="list" item="item" index="index" open= ...

  7. mybatis 中 foreach collection的三种用法(转)

    文章转自 https://blog.csdn.net/qq_24084925/article/details/53790287 oreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集 ...

  8. 谈一下思考,关于mybatis中<foreach collection="list">中list得来的原因 没看到官方说明

    <foreach> 是在sql语句中进行多个id查询 时用到的,因为mybatis代替jdbc和hibernate, 使用 在xml文件中编写sql语句,这是一个标签文件.然后在 dao层 ...

  9. MyBatis中foreach循环的用法

    一.在了解foreach之前,先了解一下mybatis传入参数及parameterType 1.我们在Dao层向对应的mapper.xml文件传递参数时,可以传递的参数有: ①.基本数据类型(如int ...

随机推荐

  1. DRF框架中链表数据通过ModelSerializer深度查询方法汇总

    DRF框架中链表数据通过ModelSerializer深度查询方法汇总 一.准备测试和理解准备 创建类 class Test1(models.Model): id = models.IntegerFi ...

  2. 基于【 centos7】一 || 安装ELK

    一.安装jdk 上传安装包并解压:tar -zxvf ... 配置环境变量: 在配置文件中添加如下配置信息:vi /etc/profile export JAVA_HOME=/usr/local/jd ...

  3. document对象详解

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...

  4. 使用Linux的tcpdump命令结合Windows的wireshark抓包和分析

    tcpdump简介 tcpdump是Linux系统下的一款抓包命令集,工作原理是基于网卡抓取流动在网卡上的数据包.在Linux系统中由于tcpdump命令的简单和强大,我们一般直接使用tcpdump命 ...

  5. httpd源码编译安装

    什么是编译安装——编译:将源代码变为机器可执行的代码文件.安装:将可执行文件安装到操作系统里,才可以使用. 一.下载httpd源码包 在官网上下载httpd源码包http://httpd.apache ...

  6. sh make.sh fatal error: opencv2/opencv.hpp: No such file or directory

    问题: sh make.sh fatal error: opencv2/opencv.hpp: No such file or directory 解决: sudo apt-get install l ...

  7. 挖矿病毒watchbog处理过程

    1 挖矿病毒watchbog处理过程 简要说明 这段时间公司的生产服务器中了病毒watchbog,cpu动不动就是100%,查看cpu使用情况,发现很大一部分都是us,而且占100%左右的都是进程wa ...

  8. java.lang.IllegalStateException: Cannot initialize context because there is already a root application context present

    @Controller@ComponentScan@Configuration@EnableScheduling@EnableAutoConfiguration(exclude={DataSource ...

  9. Vulkan 02

    https://www.imgtec.com/blog/vulkan-high-efficiency-on-mobile/ vulkan性能上的优势 降低CPU开销 drawcall上限数量增加 Ho ...

  10. 从 ES6 到 ES10 的新特性万字大总结

    以下文章来源于鱼头的Web海洋 ,作者陈大鱼头   鱼头的Web海洋 一个名为Web的海洋世界 (给前端大全加星标,提升前端技能) 作者:鱼头的Web海洋 公号 / 陈大鱼头 (本文来自作者投稿) 介 ...