• 关于综合查询的性能优化问题的解决一个思路


            在项目中,总是会有什么什么列表查询,然后还要求根据类型分类查询,有时候发现不同类型关联的表不相同,想要获得的东西也不相同,之前我查询方法总是采用union 将几个相关表连接起来,这样造成的问题是,压力全部在数据库上,

    后来根据领导的建议,我将相同的基表先查出来,然后,采用for循环将不同关联的表按条件进行查询关联设置值,这样做就可以将数据库大量关联表查询的压力降低并转移出来,然后在service层中进行for循环操作,如果在service层中分页,也就是一个页码数量的循环,压力一下子就小了。

    但是也存在一个问题就是综合查询时候,有的产品要求模糊查询,模糊的字段比较多,比如要求模糊基表以外的一些字段,就不能模糊了,因为我们已经把这些值放在service层中根据条件来添加到相关条目中的。

    具体要求如何,怎么操作,就看产品和后端如何讨论确定了。

    转移到service层的代码如下:主要体现在for循环中不同类型连表不同,如类型是12,则关联account表和gadleeOrder表,查出数据后设置进相应的那一条message中,如果是类型16,则关联device相关表然后查处device相关信息设置到相应那一条的message中。

        @Override
        public PageInfo<Message> userSelectMessageList(Map<String,Object> paramMap) {
        	Integer pageNum = (Integer) paramMap.get("pageNum");
        	Integer pageSize = (Integer) paramMap.get("pageSize");
        	Integer messageType = (Integer) paramMap.get("messageType");
        	PageHelper.startPage(pageNum, pageSize);
        	if(messageType==0){
        		List<Message> list = messageMapper.userSelectMessageList0(paramMap);
        		Integer startRow = (pageNum-1)*pageSize+1;
        		Integer endRow = pageNum*pageSize<list.size()?pageNum:list.size();
        		for(int i=startRow;i<=endRow;i++){
        			if(list.get(i-1).getInfoType()==12){
        				Integer number = deviceMapper.getDeviceNumberByOrderId(list.get(i-1).getValue1());
        				Account account = accountMapper.selectByOrderId(list.get(i-1).getValue1());
        				GadleeOrder gadleeOrder = gadleeOrderMapper.selectByPrimaryKey(list.get(i-1).getValue1());
        				if(account!=null){
        					list.get(i-1).setName(account.getUserName());//用户名称
        				}
        				if(gadleeOrder!=null){
        					list.get(i-1).setGadleeOrder(gadleeOrder);
        				}
        				if(number!=null){
        					list.get(i-1).setNumber(number.toString());//订单下设备数量
        				}
        			}else{
        				Device device = deviceMapper.selectByDeviceRepairId(list.get(i-1).getValue1());
        				if(device!=null){
        				list.get(i-1).setName(device.getDeviceName());//设备名称
        				list.get(i-1).setNumber(device.getModel());//设备型号
        				}
        			}
        		}
        		return new PageInfo<Message>(list);
        	}
        	if(messageType==12){
        		List<Message> list = messageMapper.userSelectMessageList12(paramMap);
        		Integer startRow = (pageNum-1)*pageSize+1;
        		Integer endRow = pageNum*pageSize<list.size()?pageNum:list.size();
        		for(int i=startRow;i<=endRow;i++){
        			Integer number = deviceMapper.getDeviceNumberByOrderId(list.get(i-1).getValue1());
        			list.get(i-1).setNumber(number.toString());
        		}
        		return new PageInfo<Message>(list);
        	}
        	if(messageType==16){
        		List<Message> list = messageMapper.userSelectMessageList16(paramMap);
        		return new PageInfo<Message>(list);
        	}
        	return null;
            }
  • 相关阅读:
    推荐一款国内首个开源全链路压测平台
    面试必备:接口自动化测试精选面试干货!
    测试开发:你所需要掌握了解的性能测试知识
    推荐一款自动化测试神器,不会写代码也能做!
    测试开发进阶:一文教你从0到1搞懂大数据测试!
    Java 在PPT中插入OLE对象
    Java 在Word中创建多级项目符号列表和编号列表
    C# / vb.net 给PDF 添加可视化和不可见数字签名
    Java 给Word添加印章
    Java 加载、操作和保存WPS文字文档
  • 原文地址:https://www.cnblogs.com/xiaoyao-001/p/9269789.html
Copyright © 2020-2023  润新知