首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 效能優化:雙層 for 迴圈 250 萬次 vs 500 次 DB 查詢,HashMap 降維打擊

     編輯:程式設計綜合問答

場景還原

  • 表 A:500 筆。
  • 表 B:500+ 筆。
  • 需求:關聯 A.id = B.a_id,組裝 Map 輸出。

方案對比

方案時間複雜度實際耗時估算致命傷
方案一:迴圈查 DB (N+1 問題)
for(A a: listA) { B b = dao.getById(a.id); }
O(N) * DB_RTT500 * (網路延遲 1-5ms + DB 執行 0.5ms) ≈ 500ms - 2.5s網路往返 (RTT) 為主,資料庫連線池壓力大,極易超時。
方案二:雙層 for 記憶體比對
for(A a: listA) for(B b: listB) if(a.id==b.aid)
O(N*M) = 250,000純記憶體運算 ≈ 1ms - 5ms資料量增長為平方級 (1萬筆→1億次),不可擴展。
方案三:HashMap 索引 (最佳解)
Map mapA = ...; for(B b: listB) { A a = mapA.get(b.aid); }
O(N+M) = 1,000建 Map + 查找 ≈ 0.5ms - 2ms**線性複雜度,記憶體換速度,完美支援百萬級資料。**

最佳實踐代碼 (方案三)

// 1. 一次性查出所有需要的數據 (2 次 DB 交互)
List listA = dao.selectAllA(); // SELECT * FROM A
List listB = dao.selectAllB(); // SELECT * FROM B

// 2. 建立 HashMap 索引 (Key 為關聯鍵,Value 為對象或所需字段)
// 若 A 唯一:Map mapA = new HashMap<>();
// 若 A 可能重複 (一對多):Map> mapA = new HashMap<>();
Map mapA = new HashMap<>(listA.size() * 2); // 預估容量避免擴容
for (A a : listA) {
    mapA.put(a.getId(), a); // 假設 id 唯一
}

// 3. 遍歷 B 直接 O(1) 命中
List results = new ArrayList<>();
for (B b : listB) {
    A a = mapA.get(b.getAid());
    if (a != null) {
        Map item = new HashMap<>();
        item.put("A", a.getName());
        item.put("B", b.getTime());
        results.add(item); // 或直接組裝 DTO
    }
    // else: B 找不到對應 A,視業務決定是否保留
}

// 4. 若需包含「無 B 對應的 A」,再遍歷 mapA.values() 檢查是否已被引用
// (可用 Set matchedIds 記錄)

資料庫層面的終極優化:SQL JOIN

**最快的代碼是不寫代碼,讓資料庫做關聯。**

SELECT a.name, b.time 
FROM A a 
LEFT JOIN B b ON a.id = b.a_id 
-- 可加 WHERE 條件
-- 若需分頁:LIMIT offset, size
  • 單次 SQL 執行,資料庫引擎優化 (Hash Join / Merge Join / Nested Loop) 遠勝應用層。
  • 網路傳輸量最小 (只傳結果集)。
  • 利用索引 (A.id, B.a_id) 秒級完成百萬級關聯。

總結決策樹

  1. 能用 SQL JOIN 解決? → **直接寫 SQL**,效能最高、代碼最少。
  2. 業務邏輯極複雜無法下推 SQL? → **應用層 HashMap 索引 (方案三)**,O(N+M) 線性複雜度,拒絕雙層 for、拒絕迴圈查 DB。
  3. 資料量超大 (百萬級+) 記憶體裝不下? → 分頁查詢 + 遊標 / 臨時表 / 離線計算 (Spark/Flink)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved