java 优化查询_JAVA 提高查询效率,sql优化

问题

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

解决思路

增加超时时间(治标不治本)

找到后台查询时间久的原因(在前端请求后台的接口上,给调用的方法打上时间戳,以此来找到对应耗时的方法,以及耗时的时间)

过程

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

本人查询数据库的方式

List orderList = new ArrayList();

List 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的小方法

写好 where,缩短查询范围

select 指定获取的字段 ,而不是 *

sql 模糊查询的配合变量的方式 (LIKE CONCAT('%', 变量名 , '%'))

判断空值,设为 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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值