• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

java 业务逻辑中的小优化技巧,关联表查询影响到主查询的速度问题。

互联网 diligentman 1个月前 (01-31) 17次浏览

大家在开发过程中总能遇到某个数据表需要加个字段数据的情况,然而有些数据要关联到大表,就会造成总体查询效率大大降低的情况,这篇文章提供一个小思路,小技巧分享给大家。
上代码(需求场景是在主数据中加入一个统计金额的数据,统计金额需要关联某个大表,造成大表连大表的尴尬情况):

public PageInfo<Map> pageBill(Map params,Integer pageNum, Integer pageSize) {
		//分页 分页场景使用更佳
        PageMethod.startPage(pageNum, pageSize); 
        //主数据查询
        List<Map> list = someBillMapper.listBill(params);
        if(list != null && list.size() > 0){
            /**
               先将从数据需要用到的id提炼出来,此id是主数据与从数据关联的id(a.id = b.pid),
               通过此id,从数据查询就可以精确高效的查询出需要的数据。
            */
            StringBuilder sb = new StringBuilder();
            for (Map m :list) {
                sb.append(","+m.get("id"));
            }
            /**
            	从数据(通过上面得到的id直接查询需要的数据:
            	大概理解就是: select id,pid,amount from table where id in (提炼出来的id集)
            	此为简化的 实际场景复杂的多。
            */
            List<Map> otherAccount = someBillMapper.getOtherAccount(sb.toString().substring(1));
            /**
            	核心1:将查询出来的从数据通过map集合存起来,
            	key为从数据的关联pid(主 a.id = b.pid 从关系),value为整行map数据(id,pid,amount)
            */
            Map comMap = new LinkedHashMap();
            for (Map m :otherAccount) {
                comMap.put(m.get("pid"),m);
            }
			/**
				核心2:遍历主数据,比对id,id相等将从数据插入主数据,实现主数据增加从数据。
			*/
            for (Map p : list ) {
                if(comMap.containsKey(p.get("id"))){
                    Map son= (Map) comMap.get(p.get("id"));
                    p.put("account",son.get("account"));
                }
            }
        }
        PageInfo<Map> pageInfo = new PageInfo<Map>(list);
        return pageInfo;
    }
	大体就是这种思路,公司因为出台慢SQL标准,所以要尽量避免一个sql关联太多表查询,需要将业务拆分,以前的多表关联都要拆成单表,双表,在代码里跑,可以减轻数据库的负担同时减少慢sql的数量。不管几个表,拆解思路基本都是这样子。


喜欢 (0)