有一个 MySQL 表,服务器上的用户。它有 28 行和 100 万条记录(也可能会增加)。我想从这个表中获取所有行,对它们进行一些操作,然后将它们添加到 MongoDB 中。我知道通过简单的“从用户中选择*”操作来检索这些记录将花费大量时间。我一直在用Java、JDBC 来做这件事。
所以,我从研究中得到的选择是:
选项 1. 进行批处理:我的计划是从表中获取总行数,即。从用户中选择 count(*)。然后,将提取大小设置为 1000 (setFetchSize(1000))。之后我就被困住了。我不知道我是否可以写这样的东西:
Connection conn = DriverManager.getConnection(connectionUrl, userName,passWord);
Statement stmt =conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,java.sql.ResultSet.CONCUR_READ_ONLY);
String query="select * from users";
ResultSet resultSet=stmt.executeQuery(query);
我的疑问是,一旦执行查询,结果集是否会有 1000 个条目,我是否应该重复执行该操作,直到检索到所有记录。
我放弃了这个计划,因为我知道对于 MySQL,ResultSet 会立即完全填充,批处理可能不起作用。这个 stackoverflow 讨论 https://stackoverflow.com/questions/24098247/jdbc-select-batching-fetch-size-with-mysql and MySQL 文档 http://dev.mysql.com/doc/refman/5.0/es/connector-j-reference-implementation-notes.html_帮忙了。
选项2.进行分页:我的想法是设置一个限制,它将告诉获取的起始索引和获取的偏移量。可能是将偏移量设置为 1000 并迭代索引。
我读了一篇推荐的文章link http://www.xarg.org/2011/10/optimized-pagination-using-mysql/,但没有发现使用 Limit 解决此问题的任何漏洞。
如果有足够好心和足够耐心阅读这篇长文的人,请分享您对我的思考过程的宝贵意见,如果有错误或遗漏的地方,请纠正我。
根据我所做的研究回答我自己的问题:
批处理对于选择查询并不是真正有效,特别是如果您想使用每个查询操作的结果集。
分页 - 如果您想提高内存效率而不是提高执行速度,则很好。当您使用 Limit 触发多个查询时,速度会下降,因为每次 JDBC 都必须连接到 MySQL。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)