5

我们有一个包含 12,000,000 多条记录的 innodb 表。

SELECT *我使用JDBC使用两种方法从这个表中获取。

Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

这种方式让驱动程序可以逐行流式传输结果集,并且需要 7 秒才能完成扫描。

Statement stmt =conn.createStatement();

结果集被完全检索并存储在内存中。这种方式需要 21 秒!

只是感到困惑,为什么逐行获取结果集比将完成的结果集检索到客户端内存中要快?逐行的方式不应该花费更多的时间进行网络传输吗?

4

1 回答 1

1

只是为了扩展我对 OP 的评论

这很可能是内存问题 - 将 12m 结果读入内存可能会导致分页,除非客户端有大量 RAM。一旦你开始颠簸磁盘,性能就会大大下降。值得注意的是,如果您确实开始增加 RAM,JVM 在处理 >32G 的地址(它切换到 64 位指针)方面会出现一些问题,这意味着当您过渡到超过 32G 时,您实际上会丢失可用内存并且可能会出现其他问题,具体取决于关于你的代码是如何编写的。

从长远来看,我们目前正在使用弹性搜索来索引大约 6000 万个文档。诚然,在处理索引、缓存等时,内存使用会更加复杂……但我们不会考虑为其提供少于 16G 的 RAM 以获得高性能响应。我遇到过使用每个分片大于 100G 来获得非常大的记录集的人。

于 2012-11-16T12:28:07.377 回答