首页 > 其他分享 >Mybatis慢查询问题

Mybatis慢查询问题

时间:2024-01-22 11:24:24浏览次数:26  
标签:searchModel SBDW id 问题 sql Mybatis 查询 ID

一、问题

使用Mybatis查询数据库数据时发现,时间跨度大且数据量多的情况下,查询速度变得十分慢,120s以上
然而将sql语句放至数据库中去查询时速度很快,只在10s左右
带两个时间条件的情况下,最慢
任意一个时间或者不带时间次之

二、Mybatis中的sql

select h.SBDW_ID, h.SBDW ,count(distinct SBR_ID) as countNumber,'hcrs' as statisticType
        from  zfapp_dsj_HCXX h
        <where>
            h.ENABLE_FLAG = 1 and h.DEL_FLAG = 0 and h.zt='1' and exists (select 1 from T_USER_POST t,T_USER u,T_POST p where t.post_id=p.id and u.id=t.user_id  and   u.id = h.SBR_ID
            and p.department_id = h.sbdw_id and u.status = 0)
            <if test="searchModel !=null and searchModel.hcStartTime != null">
                and h.SBSJ &gt;= #{searchModel.hcStartTime}
            </if>
            <if test="searchModel !=null and searchModel.hcEndTime != null">
                and h.SBSJ &lt; #{searchModel.hcEndTime}+1
            </if>
            <if test="searchModel != null and searchModel.departmentId != null and searchModel.departmentId.length > 0">
                and h.SBDW_ID in
                <foreach collection="searchModel.departmentId" item="dep" open="(" separator="," close=")">
                    #{dep}
                </foreach>
            </if>

        </where>
        group by h.SBDW_ID, h.SBDW
union
  ...

至少有19个这样的语句拼接到一起

三、分析

在将

#{searchModel.hcStartTime}

修改为

to_date('${searchModel.hcStartTime}', 'yyyy-MM-dd')

后速度和数据库中执行的速度一致;

推测原因可能是因为mybatis将#{}作为占位符进行预编译,在参数类型与数据库字段类型不匹配的时候会对参数进行类型处理,导致时间变慢

但是为什么数据量小的时候速度并不慢?

四、解决方案

1、临时解决方案:
1)使用java.sql.date接收日期参数,并对日期参数进行校验防止sql注入;
2)将#{}改为${},并使用oracle的to_date函数进行转换

标签:searchModel,SBDW,id,问题,sql,Mybatis,查询,ID
From: https://www.cnblogs.com/congshaoblog/p/17975379

相关文章

  • js用前缀名查找class或id节点,js模糊查询某个dom节点
     1//参数dom为htmldom节点2//参数key为需模糊查询的名称字段3functionqueryClassNode(dom,key){4letcollectArray=[];5for(leti=0;i<dom.childNodes.length;i++){6//核心点7if(d......
  • 股票买卖问题总结
    其实也是动态规划的一种变形,总的来说,是定义一个二维数组dp[i][j],i表示的是天数,j表示的状态,总的表示收益。最基础的就是有两种状态,dp[i][0]表示未持有股票,dp[i][1]表示持有股票。用动态规划的思想:dp[i][0],dp[i][1]都是从dp[i-1]推得的。只买卖一次:点击查看代码dp[i][0]=......
  • ubuntu22.04 mysql服务每天自动shutdown问题
    1.问题描述MYSQL每天自动关闭,查看/var/log/mysql/error.log.1.gz,内容如下:2019-06-12T06:33:13.582973+08:000[Note]Shuttingdownplugin‘CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS’2019-06-12T06:33:13.583022+08:000[Note]Shuttingdownplugin‘CONNECTION_CON......
  • 【LeetCode 2494. 合并在同一个大厅重叠的活动】[MySQL 用户变量/Pandas]面向过程编程
    目录题目地址MySQL代码等效pandas代码题目地址https://leetcode.cn/problems/merge-overlapping-events-in-the-same-hall/MySQL代码#WriteyourMySQLquerystatementbelowwitht2as(select*#----只需要改动这里的逻辑,其他不要动。注意里面的语句是“顺序......
  • 【Leetcode 2474. 购买量严格增加的客户】[MySQL 用户变量/Pandas]面向过程编程解决严
    目录题目地址MySQL代码等效pandas代码题目地址https://leetcode.cn/problems/customers-with-strictly-increasing-purchases/description/MySQL代码#WriteyourMySQLquerystatementbelowwitht1as(selectcustomer_id,year(order_date)asmy_year,sum(price)......
  • 如何查询关键词的KD与搜索量
    随着海外贸易的不断发展,越来越多的小伙伴们从事外贸行业,但是随着面对有限的市场和激烈的竞争,很多从业者往往流量的来源比较单一,那就是付费流量,包括谷歌ads,facebook等一些投流广告。广告的好处是当你付出金钱的时候,很快就可以看到结果,点击、曝光甚至表单、下单等这些信息需要不了几......
  • 桶排序 -解决了什么问题
    桶排序法的优点高效的时间复杂度:在均匀分布的情况下,桶排序的平均时间复杂度接近线性,具有较高的排序效率。这是因为桶排序将元素分散到多个桶中,每个桶独立地进行排序,而不需要像比较排序算法那样逐个比较和交换元素。适用于外部排序:桶排序适用于需要排序的数据量非常大,无法全部......
  • (区间覆盖问题)P5019 [NOIP2018 提高组] 铺设道路和Educational Codeforces Round 158 (
    区间覆盖问题这里EducationalCodeforcesRound158(RatedforDiv.2)b题和[NOIP2018提高组]铺设道路两道典型题目,本质是相同的。这里由于题目多次出现,特此记录。解题思路:首先我们得对区间做划分,那么划分思路可以是从小到大也可以是从大到小的异常点来做划分(我这是由大到......
  • 【Servlet】Request请求对象 && Response响应对象 && 资源路径问题
    Request&&Response简介在Servlet中,Request对象和Response对象是两个重要的接口,它们用于处理客户端发来的请求和向客户端发送响应。Request对象Request:获取请求数据Request继承体系Request获取请求数据Request使用通用方式获取请求参数Request请求参数中中文乱码问题......
  • ClickHouse中“大列”造成的JOIN的内存超限问题
    ClickHouse中“大列”造成的JOIN的内存超限问题“大列”是指单行数据量非常大的列,通常是100KiB以上。这样的列会导致JOIN(通常LEFTJOIN和INNERJOIN)出现内存超限的异常。常用的JOIN算法这里讨论的是常用的JOIN算法:partialmergejoin与hashjoin。Directjoin算法不在本文......