关于综合查询的性能优化问题的解决一个思路
Posted 逍遥_001
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于综合查询的性能优化问题的解决一个思路相关的知识,希望对你有一定的参考价值。
在项目中,总是会有什么什么列表查询,然后还要求根据类型分类查询,有时候发现不同类型关联的表不相同,想要获得的东西也不相同,之前我查询方法总是采用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; }
以上是关于关于综合查询的性能优化问题的解决一个思路的主要内容,如果未能解决你的问题,请参考以下文章