1

从 JDBC 结果中获取结果数量的公认方法似乎是,做resultSet.last(),然后resultSet.getRow(),根据这个答案。但是,在那个答案中,作者还说:

这可能不是一个好主意,因为它可能意味着通过网络读取整个表并丢弃数据。改为执行 SELECT COUNT(*) FROM ... 查询。

我正在寻找一个明确的答案。性能方面,做一个单独的COUNT(*)查询来获得结果的数量会更好,还是做resultSet.last()and resultSet.getRow(),然后resultSet.first()再做一次更好?

如果 ResultSet 已经获取了结果并将它们保存在内存中,那么这样做无疑会更好last()getRow()因为(我假设)它只会遍历内存中的结果。但是上面的 OP 的回答似乎暗示它会根据请求从数据库中延迟加载结果。

4

2 回答 2

1

在我看来,这取决于您的用例。如果你resultset足够小,那么性能差异可以忽略不计。我非常怀疑是否会resultset在主内存中获取更大的结果集的整个结果。其次,这里是讨论这个特定场景的链接。last()在这种情况下,使用,getrows()随后计算大小first()显然效率低下,因为它必须首先将 的部分加载到resultset内存中并执行这些操作(并且不要忘记网络传输时间)来计算网络大小。另一方面count(*),只需进入并计算结果集中的行数。

这是我对哪个出类拔萃的理解。我愿意接受其他人的任何意见

于 2013-10-19T19:27:00.677 回答
1

进行单独的查询不是一个好的解决方案(在我看来),因为服务器将为一个结果集搜索行两次。

为了防止“双重”查询,MySQL 具有函数 FOUND_ROWS(),它返回为当前条件 fromWHERE子句创建的行数。当您在查询中使用 LIMIT 和 OFFSET 时,这非常有用。我相信使用这个功能是一个更好的解决方案。 http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

前段时间我读到 JDBC 从服务器流式传输行,但这不是官方文档,我不知道它目前是如何工作的,但查询可能会有所不同 - 有困难的子查询和连接。我认为服务器可以完成所有资源,如果仅在客户端要求时“流式传输”这些行。

于 2013-10-19T19:20:43.523 回答