首页 > 解决方案 > 在合并之前或在代码之后在 mysql 中订购两个列表?

问题描述

假设我有两个列表,其中包含从 mysql 查询返回的值(出于这个问题的目的,我将在此处将它们显示为已初始化,以便更容易查看列表的内容):

List<String> databaseResultsA =  new ArrayList<>(); 
databaseResultsA.add("6"); 
databaseResultsA.add("7");
databaseResultsA.add("9");


List<String> databaseResultsB = new ArrayList<>();
databaseResultsB.add("4");
databaseResultsB.add("8");
databaseResultsB.add("2");

实际上,databaseResultsA 使用 MySQL ORDER BY ASC 排序,而 databaseResultsB 没有排序。另外值得注意的是,databaseResultsB 是从 databaseResultsA 对单独的数据库进行查询的结果。

我需要将两个列表组合起来并按升序排序,因此我在代码中执行以下操作:

List<String> combinedResults = Stream.concat(databaseResultsA.stream(), databaseResultsB.stream()).sorted().distinct().collect(Collectors.toList());

我对 databaseResultsA 进行排序的原因是我希望 databaseResultsA 需要比 databaseResultsB 更频繁地返回结果;因此,如果 databaseResultsB 为空,那么代码中的排序就会减少(databaseResultsA 可能为空,而 databaseResultsB 可能有结果,但我不希望这种情况像相反的那样频繁发生)。

我的问题是,我的逻辑听起来合理吗?或者在 MySQL 中对两个列表进行排序然后在代码中排序会更好吗?我猜这是一个应该根据具体情况来判断的事情,但只是想知道这是否有经验法则。

标签: javamysqlperformancesql-order-by

解决方案


如果查询不同但在同一个数据库上,我什至不会在代码中组合。我会使用 UNION DISTINCT 然后 ORDER BY。服务器的排序很可能比任何 java 代码都快,您甚至可以通过不下载重复的行来节省一些带宽。

既然您编辑了问题并说数据库是不同的,我仍然会使用 ORDER BY 对两个查询进行排序。然后我会使用合并排序,因为你有 2 个排序的输入。我不会使用流来释放宝贵的预排序状态,而不得不再次求助。

在目标列表中合并 2 个排序的迭代器也很容易自己编写。


推荐阅读