使用 java stream() 在服务器端 API 中计数然后在 spring jpa 中重复使用计数查询调用是否更好

Is it better to count in server side API using java stream() then using count query call repeatedly in spring jpa

我想根据三个filters/conditions计算table中的行数三次。我想知道以下两种方式中哪一种更适合 performancecost-efficiency。我们使用 AWS 作为我们的服务器,java spring 开发服务器端 API 和 MySQL 数据库。

  1. 利用MySQL的count特性在数据库中查询三次三个过滤条件得到三次统计结果。
  2. 首先仅使用一个查询从数据库中获取 table 的所有行。然后根据三个过滤条件使用java流三次,得到三次计数结果。

在极端情况下最好选择选项(1)。如果执行 SELECT COUNT(*) FROM table 很慢,那么您应该考虑在 SQL 方面进行一些调整。不确定您使用的是什么,但我找到了 sql server

的示例

假设您使用选项 (2) 并且您有数十万行,我怀疑您的应用程序会 运行 在您有时间担心速度慢之前内存不足(尤其是在高负载下) 运行宁 SELECT count(*) 的响应时间。更不用说你会有很多不必要的行并减慢数据库和应用程序之间的传输时间

反对在应用程序中进行计数的一个基本论点是,将大量数据从服务器传输到客户端非常耗时。 (在极少数情况下,这种开销是值得的。)请注意,您的客户端和 AWS 可能相距很远,从而加剧了挖掘大量数据的成本。我对你所说的“服务器端API”持怀疑态度。但是即使在服务器上可以运行Java,在MySQL和Java之间还是有一定的铲土成本的。

有时这种模式可以让您通过一次数据获得 3 个计数:

SELECT 
    SUM(status='ready') AS ready_count,
    SUM(status='complete') AS completed_count,
    SUM(status='unk') AS unknown_count,
    ...

这里的技巧是布尔表达式的值为 0(表示假)或 1(表示真)。因此 SUM() 的工作方式类似于 'conditional count'.