繁体   English   中英

与两个数据库交互的查询性能问题

[英]query performance issues interacting with two databases

我正在编写一个从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);
}

我想知道在循环中用于选择查询的时间变得恒定的解决方案,或者其他可以提高性能的解决方案。

从注释中可以看出,您的Java程序有责任在客户端连接来自两个不同数据库的信息。 众所周知,这非常困难,特别是当两个数据库都很大时。

如果要对数据进行大量更改,那么很难获得一致的结果。 也许可以,但是您必须针对进程下的数据更改进行防御性编程。

如果您是我,我将通过从stm数据库连接中检索所有名称/标识对来启动程序。 我会将它们放在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()函数代替了您的问题中的查询。 因为您已将所有名称/标识对预加载到内存中,所以与对rs结果集中的每一行的查询相比,这将非常快。

为避免对Employee表进行全面扫描,请验证您是否具有适当的覆盖索引:

... ON `Employee` (`name`, `empID`)

EXPLAIN SELECT ..将显示MySQL使用的执行计划。

(注意:这仅解决所显示查询的性能。这未解决重复执行的性能问题。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM