【问题标题】:Order two lists in mysql before combining, or after in code?在合并之前或在代码之后在 mysql 中订购两个列表?
【发布时间】:2021-03-20 00:54:08
【问题描述】:

假设我有两个列表,其中包含从 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 中对两个列表进行排序然后在代码中排序会更好吗?我猜这是一个应该根据具体情况来判断的事情,但只是想知道这是否有经验法则。

【问题讨论】:

  • Please update your question 带有示例数据。发布您的 MySQL 查询并说明您正在尝试做什么。目前你的问题很难想象,恐怕它只会被投票结束。
  • 谢谢,我添加了更多信息。我没有包括 MySQL 查询,因为它们似乎不是问题的关键
  • 我可能明白你的意思,但我认为还不清楚。假设您的 MySQL 查询类似于SELECT * FROM tableA ORDER BY columnA ASC;除了ORDER BY,没有其他条件。我的问题是,用于排序的列是什么?使用该特定列进行排序有什么意义?既然要在 Java 代码中重新排序它们,为什么还要首先进行排序呢?
  • 为什么它们是否排序很重要?你如何处理这两个列表?你要合并它们吗?还是什么?
  • @RickJames 是的,感谢您的澄清,上面的示例已简化,但我正在合并结果 - 它们是来自两个单独数据库的结果,需要在预先输入的搜索中显示在搜索结果中bar,并且它们需要按升序排列。所以下面的解决方案对我来说很有意义,对查询进行排序,然后进行合并排序以获得更好的性能

标签: java mysql performance sql-order-by


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢 - 我意识到我对此并不完全清楚;我在上面添加了更多详细信息 - 两个单独的列表 databaseResultsA 和 databaseResultsB 来自两个单独的数据库,这就是我在代码中组合它们的原因
  • 只是为了充实上面的评论:看来我的选择是 1. 在 MySQL 中订购两者,然后在代码中组合并再次订购。 2. 不要在 MySQL 中排序,只在代码中排序。 3.我提出的方式。 4. 不要在 MySQL 中订购 databaseResultsA,在 MySQL 中订购 databaseResultsB,然后在代码中订购两者。我想知道根据性能/可维护性推荐哪个
  • 感谢更新的解释。不必诉诸而只使用合并排序听起来更高效。我将研究将 2 个已排序的迭代器合并到目标列表中的最佳方法,并深入了解当两个查询的结果都已排序时流解决方案在幕后所做的事情。
  • 问题被标记为[mysql],所以我们不要在优化器中假设太多聪明。我不相信ORDER BY 曾经由“合并”实现。 UNION DISTINCT 强制生成临时表。 UNION ALL + ORDER BY 同上。 (我不知道UNION DISTINCT + ORDER BY 需要 1 个还是 2 个临时表。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多