当前位置: 首页> 娱乐> 八卦 > 福州个人建站模板_俄罗斯门户网站有哪些_百度竞价是什么_宁波谷歌seo推广

福州个人建站模板_俄罗斯门户网站有哪些_百度竞价是什么_宁波谷歌seo推广

时间:2025/7/14 0:11:30来源:https://blog.csdn.net/Obscurede/article/details/147594722 浏览次数:0次
福州个人建站模板_俄罗斯门户网站有哪些_百度竞价是什么_宁波谷歌seo推广

通常我们管第一种模式叫 “N+1 查询”,第二种叫 “关联聚合查询”。下面从几个角度来比较,帮助你做出选择。


1. 性能与资源消耗

方案SQL 语句数网络往返次数数据库负载Java 处理
N+1 查询
(先查项目,再遍历项目查设备状态数)
1 + N 条1 + N 次多次小查询需要在代码中汇总各个查询结果
关联聚合查询
(一次 SQL → 按项目+状态分组计数)
1 条1 次单次大查询(GROUP BY)直接拿到全量结果,按项目和状态映射到 DTO
  • N+1 查询在项目数量(N)大的时候,网络往返和数据库连接开销会急剧上升,容易成为性能瓶颈。
  • 关联聚合查询只需要一次往返,数据库做完 GROUP BY 聚合后,Java 端几乎不用额外计算,通常响应更快、更稳定。

2. 可维护性与拓展性

  • N+1 查询

    • 逻辑散落在多条 SQL/DAO 调用里,代码量和耦合度都更高。
    • 如果新增状态或需要统计别的维度(如按设备类型、品牌等),要修改多处查询逻辑。
  • 关联聚合查询

    • 聚合逻辑集中在一条 SQL 里,可读性更好。
    • 新增统计维度(例如按设备类型再分组)也只需在同一句 SQL 加 CASE WHEN 或多维度 GROUP BY

3. 示例

假设表结构简化为:

-- 项目表
CREATE TABLE project (project_id   BIGINT PRIMARY KEY,project_name VARCHAR(100)
);-- 设备表
CREATE TABLE device (device_id    BIGINT PRIMARY KEY,project_id   BIGINT,state        VARCHAR(20)  -- 如 '待调试', '待验收' 等
);

2.1 关联聚合查询示例

SELECTp.project_id,p.project_name,-- 按不同状态计数SUM(CASE WHEN d.state = '待调试' THEN 1 ELSE 0 END) AS cnt_debugging,SUM(CASE WHEN d.state = '待验收' THEN 1 ELSE 0 END) AS cnt_acceptance,SUM(CASE WHEN d.state = '已上线' THEN 1 ELSE 0 END) AS cnt_online
FROM project p
LEFT JOIN device dON p.project_id = d.project_id
GROUP BY p.project_id, p.project_name;
  • 优点
    • 一条 SQL 就拿到所有项目在各状态下的设备数。
    • 如果新增“维修中”“已淘汰”之类的状态,只要再加一个 SUM(CASE…)

2.2 Java 端映射(MyBatis / Spring Data JPA)

// DTO 接口或类
public class ProjectDeviceStat {private Long projectId;private String projectName;private Integer cntDebugging;private Integer cntAcceptance;private Integer cntOnline;// getters & setters
}// MyBatis mapper
@Select("""SELECTp.project_id AS projectId,p.project_name AS projectName,SUM(CASE WHEN d.state = '待调试' THEN 1 ELSE 0 END) AS cntDebugging,SUM(CASE WHEN d.state = '待验收' THEN 1 ELSE 0 END) AS cntAcceptance,SUM(CASE WHEN d.state = '已上线' THEN 1 ELSE 0 END) AS cntOnlineFROM project pLEFT JOIN device d ON p.project_id = d.project_idGROUP BY p.project_id, p.project_name""")
List<ProjectDeviceStat> selectProjectDeviceStats();

4. 何时考虑 N+1 查询?

  • 当项目数量非常 (比如只有 1–3 个)且业务逻辑简单时,用第一种写法可能更直观,且对性能影响可忽略不计。
  • 但一旦项目量或状态维度增加,性能损耗就会成倍增加,不推荐用于生产环境。

5. 结论

  • 推荐: 使用 关联聚合查询(单表 JOIN + GROUP BY),既减少网络和数据库往返,又让统计逻辑集中、易于扩展和维护。
  • 仅当项目量极少、统计字段极少,且对性能无严格要求时,才可酌情使用第一种 N+1 查询。

希望对你有所帮助!如果需要进一步优化(如添加索引、使用视图或物化视图、或在 Java 层面缓存),可以再详细讨论。

关键字:福州个人建站模板_俄罗斯门户网站有哪些_百度竞价是什么_宁波谷歌seo推广

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: