大家在開發程序中總能遇到某個資料表需要加個欄位資料的情況,然而有些資料要關聯到大表,就會造成總體查詢效率大大降低的情況,這篇文章提供一個小思路,小技巧分享給大家,
上代碼(需求場景是在主資料中加入一個統計金額的資料,統計金額需要關聯某個大表,造成大表連大表的尷尬情況):
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的數量,不管幾個表,拆解思路基本都是這樣子,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/254813.html
標籤:其他
上一篇:Redis 有什么優勢?
