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

        在项目中,总是会有什么什么列表查询,然后还要求根据类型分类查询,有时候发现不同类型关联的表不相同,想要获得的东西也不相同,之前我查询方法总是采用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;
        }
原文地址:https://www.cnblogs.com/xiaoyao-001/p/9269789.html