3

假设我有一个非常大的表,里面有很多数据(比如说,不够适应内存),我想分析行的一个子集。

通常这样做是否更快:

SELECT (column1, column2, ... , columnN) FROM table WHERE (some complicated boolean clause);

然后使用 ResultSet,或者这样做更快:

SELECT (column1, column2, ... , columnN) FROM table;

然后遍历 ResultSet,根据您的布尔条件的 Java 版本接受不同的行?

我认为这归结为 Java 迭代器/布尔求值器是否比 MySQL 布尔求值器快。

4

4 回答 4

13

将条件发送到数据库几乎肯定会更快。

  • 您可以避免传输大量不需要其数据的行。
  • 数据库可能使用比表扫描更快的方法。它可能能够使用一个索引,使其能够更快地找到感兴趣的行,而无需检查每一行的条件。
于 2010-04-24T22:02:13.430 回答
4

我认为这归结为 Java 迭代器/布尔求值器是否比 MySQL 布尔求值器快。

不,决定因素几乎肯定是必须通过网络传输的数据量(以及各种开销)。在 99% 的情况下,减少数据库服务器上的结果集大小是正确的做法。在可能导致较小连接的复杂查询中尤其如此。

于 2010-04-24T22:04:53.533 回答
3

As a general rule, the database wins. That will almost certainly be the case for you. If you want to be sure though, profile it. I have run into cases in other languages where the overhead of transferring a lot of data was offset by the fact that some of the processing could be done outside of the DB much faster than in it. If the boolean condition you are evaluating is extremely complex to express in relational terms, you could see a benefit in evaluating it in Java, but it is extremely unlikely.

于 2010-04-25T02:35:24.713 回答
1

该数据库旨在优化您的任务。你的语言不是。并且数据库可能比您的工作站具有更好的缓存资源来防止磁盘操作。

这有点像询问您是否应该先将数据下载到 Excel 中,其中的数据量大于 Excel 在内存中的容量。

于 2010-04-24T22:05:10.303 回答