一尘不染

使用JDBC遍历大表的最快方法

mysql

我正在尝试创建一个Java程序来清理和合并表中的行。该表很大,大约有50万行,而我当前的解决方案运行得非常慢。我要做的第一件事就是简单地获得一个内存中的对象数组,这些对象表示表的所有行。这是我在做什么:

  • 一次选择说1000行的增量
  • 使用JDBC在以下SQL查询中获取结果集SELECT * FROM TABLE WHERE ID> 0 AND ID <1000
  • 将结果数据添加到内存数组中
  • 继续以1000为增量,一路查询多达500,000,每次添加结果。

这需要很长时间。实际上,它甚至没有超过第二个增量(从1000到2000)。查询要花很长时间才能完成(尽管当我直接通过MySQL浏览器运行同一件事时,它的运行速度相当快)。自从我直接使用JDBC以来已经有一段时间了。有更快的选择吗?


阅读 546

收藏
2020-05-17

共1个答案

一尘不染

首先,确定要在内存中存储整个表吗?也许您应该考虑(如果可能)选择要更新/合并/等的行。如果确实需要整个表,则可以考虑使用可滚动的ResultSet。您可以这样创建它。

// make sure autocommit is off (postgres)
con.setAutoCommit(false);

Statement stmt = con.createStatement(
                   ResultSet.TYPE_SCROLL_INSENSITIVE, //or ResultSet.TYPE_FORWARD_ONLY
                   ResultSet.CONCUR_READ_ONLY);
ResultSet srs = stmt.executeQuery("select * from ...");

它使您可以使用“绝对”和“相对”方法移动到所需的任何行。

2020-05-17