关于综合查询的性能优化问题的解决一个思路
在项目中,总是会有什么什么列表查询,然后还要求根据类型分类查询,有时候发现不同类型关联的表不相同,想要获得的东西也不相同,之前我查询方法总是采用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; }
本博主支持并坚持原创,本博客文章将以原创为主。