2013-05-13 45 views
0

我使用mysql与jdbc。我需要遍历表中的每一行(60,000行,table = InnoDB),并对每个行进行一些处理。选择表中的每一行而不使用限制?

请问mysql会接受一个没有限制的查询吗?在最简单的实现,我只是选择整个表格,并保持迭代的结果,而光标给了我更多的结果:

PreparedStatement stmt = conn.prepareStatement("SELECT * FROM foo"); 
ResultSet rs = stmt.getResultSet(); 
while (rs.next()) { 
    .. do stuff on each row .. 
} 

我可以实现课程的分页查询做到这一点分批,但它会如第一种方法所述那样简单。我想知道mysql是否在内部执行此操作,或者它试图首先将整个查询结果集加载到内存中?

感谢

+0

它将所有内容加载起来,如果感觉像它一样会炸掉内存 – Drew 2013-05-13 03:41:48

+1

_“请问mysql会接受一个没有这种限制的查询吗?”_为什么不呢?你为什么不尝试一下,看看? – 2013-05-13 03:42:55

+0

@DrewPierce将fetchsize设置为'Integer.MIN_VALUE'不会让你的内存受到MySQL JDBC的影响。 – 2013-05-13 10:51:13

回答

0

MySQL是要运行它,并尽力肯定的,或者至少尝试使用我们的记忆中,直到它用完。这也是其他几点中有趣的亮点:

  1. 即使使用LIMIT,MySQL分析器仍然会在您的表中执行全面扫描。在此过程之后LIMIT运行在一个级别;
  2. MySQL会尝试使用你的内存,如果它不够用,解析器将它交换到文件系统,这在性能方面要慢得多和昂贵;
  3. 尝试使用索引和WHERE CLAUSE充分利用查询。当然你不需要把所有的东西都带到你的应用程序层;

祝你好运!

+0

如果没有ORDER等(如帖子中所示),RDBMS可以自由地从表格中返回所有结果,几乎可以选择任何顺序 - 通常是物理布局。同样,如果在这里提供了LIMIT *,那么RDBMS可以自由地以任何它选择的方式返回所述行数(但不多于)。如果没有WHERE/ORDER/GROUP/etc子句,那么索引不适用,因此没有必要对“表扫描”进行重读 - 它只需读取数据即可返回。 – user2246674 2013-05-13 03:59:59

相关问题