我正在编写一个程序来从MySQL数据库中获取值并插入到文件中。
我的数据库非常庞大,包含大约1500万条记录。因此,经过一段时间后,程序会变慢,因为我可能会发生更多的表扫描。
我的程序结构是这样的,我从结果集中的数据库中获取一些值,并从结果集中循环每个值,并将此值插入到select查询的where子句中,以从不同的数据库中获取数据,最后得到值
以下是示例代码:
while(rs.next()) {
String name = rs.getString("name");
String query = "SELECT empID from Employee where name="+name;
rs2 = stm.executeQuery(query);
}
我想知道解决方案,其中循环中的选择查询的时间变得不变或者其他一些可以提高性能的解决方案。
答案 0 :(得分:0)
从评论中可以看出,您的Java程序有责任在客户端加入来自两个不同数据库的信息。这是非常困难的,特别是当两个数据库都很大时。
如果正在对数据进行大量更改,您将很难产生一致的结果。这可能没问题,但您必须围绕流程下方的数据进行防御性编程。
如果我是你,我会通过检索stm
数据库连接中的所有名称/ ID对来启动我的程序。我会把它们放在一个HashMap中。然后在从rs
结果集中读取时,我会从HashMap中的名称中查找id。此策略将花费一些内存,但将消除嵌套查询。
这是代码草图。它没有被调试。对不起,我没有时间为你调试它。如果你要将它放在你的程序中,你需要很好地理解它以进行调试。
/* preload name and empID values into a hashmap */
HashMap<String, Integer> name_id = new HashMap<String, Integer>();
String query = "SELECT name, empID from Employee";
rs2 = stm.executeQuery(query);
while (rs2.next()) {
String name = rs2.getString("name");
Integer id = rs2.getInteger("empID);
name_id.put(name, id);
}
rs2.close();
/* loop over the result set from the other database */
while(rs.next()) {
String name = rs.getString("name");
Integer empID = name_id.get(name);
}
此处name_id.get()
函数代替了您问题中的查询。由于您已将所有名称/ ID对预加载到内存中,因此与rs
结果集中每行的查询相比,这将快速 非常 。
答案 1 :(得分:0)
为避免对Employee
表进行全面扫描,请确认您有合适的覆盖索引:
... ON `Employee` (`name`, `empID`)
EXPLAIN SELECT ..
将显示MySQL使用的执行计划。
(注意:这只能解决所显示查询的性能。这并不能解决重复执行的性能问题。)