zoukankan      html  css  js  c++  java
  • JAVA 提高查询效率,sql优化

    问题

    在前端像后端请求数据时,后台查询时间过久,导致传输超时

    解决思路

    1. 增加超时时间(治标不治本)
    2. 找到后台查询时间久的原因(在前端请求后台的接口上,给调用的方法打上时间戳,以此来找到对应耗时的方法,以及耗时的时间)

    过程

    经过时间戳的增加,发现,后台查询数据过久的原因,在于,查询数据库上。
    本人查询数据库的方式

    List<Order> orderList = new ArrayList();
    List<User> userList = userDao.selectByType(type);
    for(User user : userList){
          Order order = orderDao.selectByUser(user.getId());
          orderList.add(order);
    }
    return orderList;
    

    由此可以发现,问题出现在,对两个表的查询操作,用,先查询一个表获得数据,再循环遍历数据查询另外一个表。导致时间耗费久。
    对于两个表的查询操作,可以通过多表联查来进行。
    多表联查,推荐博客https://www.cnblogs.com/shineguang/p/11354570.html

    在查找优化过程的时候,也找到了一些使用sql的小方法

    1. 写好 where,缩短查询范围
    2. select 指定获取的字段 ,而不是 *
    3. sql 模糊查询的配合变量的方式 (LIKE CONCAT('%', 变量名 , '%'))
    4. 判断空值,设为 0,IFNULL(进行判断的属性名 , 0)

    结果

    最后使用的 sql 语句,时间优化(从原来的 3.5s 提升到 0.3s)

    SELECT
    	sys.`id` id ,sys.`real_name` NAME, 
    	IFNULL( a.`finish`,0) finish,
    	IFNULL(b.`unfinish`,0) unfinish 
    	FROM sys_user sys
    	LEFT JOIN (
    	SELECT 
            sys_user.`id` id,
            sys_user.`real_name`,
            COUNT( * ) AS finish
            FROM sys_user 
            LEFT JOIN wo_order ON  wo_order.`handler_user_ids` LIKE CONCAT('%' , sys_user.`id` , '%')
            WHERE 
            sys_user.`org_code`='1300B00' AND
            sys_user.`is_handle_user` != 0 AND
            
            wo_order.`create_time` BETWEEN '2020-00-00 16:54:21' AND '2020-12-30 16:54:21'
            GROUP BY sys_user.`id`
            ) AS a ON sys.`id`=a.`id`
            LEFT JOIN(
    		SELECT 
            sys_user.`id` id,
            sys_user.`real_name`,
            COUNT( * ) AS unfinish
            FROM sys_user 
            LEFT JOIN wo_order ON  wo_order.`handler_user_ids` LIKE CONCAT('%', sys_user.`id` , '%')
            WHERE 
            sys_user.`org_code`='1300B00' AND
            sys_user.`is_handle_user` != 0 AND
            wo_order.`handling_status` = 20 AND
            wo_order.`create_time` BETWEEN '2020-00-00 16:54:21' AND '2020-12-30 16:54:21'
            
            GROUP BY sys_user.`id`
            )AS b ON sys.`id` = b.`id`
            
            WHERE
            sys.`org_code`='1300B00' AND
            sys.`is_handle_user` != 0 
            ORDER BY a.`finish` DESC;
  • 相关阅读:
    UOS怎么设置定时关机
    UOS如何修改源地址
    UOS如何进行全文搜索
    UOS如何查看硬盘序列号
    UOS如何修改右下角水印
    UOS怎么创建网页快捷方式
    应用商店安装软件提示uos-browser-stable错误,解决办法
    IHttpClientFactory Form 提交参数
    将.nuget文件夹移到其他盘
    windows docker 提示 bind: An attempt was made to access a socket
  • 原文地址:https://www.cnblogs.com/Kevin-QAQ/p/13719076.html
Copyright © 2011-2022 走看看