gpt4 book ai didi

java - MySQL select 与 JDBC 的性能问题

转载 作者:行者123 更新时间:2023-11-29 12:55:10 26 4
gpt4 key购买 nike

我在使用 mysql-connector v5.1.30 运行本地 Java 应用程序时遇到 MySQL (v5.5) 性能问题

我有 2 个表,分别称为 A 和 B。我运行如下:

PreparedStatement stmtA = conn.prepareStatement("select x, y, z, u, v, w from A");
PreparedStatement stmtB = conn.prepareStatement("select val from B where something = ?");
ResultSet result = stmtA.executeQuery();
while ( resultA.next() ){
// do something with result row
if (some condition) { // true approx. 80% of the time
ResultSet resultB = stmtB.executeQuery(some_value_from_resultA);
// do something with result row
resultB.close();
}
}
stmtA.close();

问题是每次大约需要 12 分钟才能完成。以下是一些相关信息:

  • mysqld 进程在 12 分钟内使用了 95-99% 的 CPU
  • java 进程在 12 分钟内使用了 1-4% 的 CPU
  • 两个进程的内存使用量可以忽略不计
  • 表 A 有 65,000 条记录,18 列(除 Id 外均为 VARCHAR)并使用 MYISAM
  • 表 B 有 51,000 条记录,4 列(3 个 INT 和 1 个 VARCHAR)并使用 MYISAM
  • 我正在查询的表 B 列上没有索引/键
  • 我运行的是配备 Core i5 和 4GB RAM 的 Ubuntu 12.04

除了 mysql 进程的 CPU 使用率疯狂这一事实之外,我认为存在问题的原因是应用程序具有针对不同数据库表运行几乎相同方法的附加功能。该表的列数与表 A 类似(也使用 MYISAM),但一个很大的区别是这里没有表 B。因此,它的工作方式与上面相同,但无需在迭代第一个表的行时查询第二个表。

另一个表有 4,500 行,迭代时间不到 1 秒。

因此,表 B 的嵌套查询似乎导致了问题,但我不确定。我对 MySQL 的经验有限。如果您需要更多信息,请询问。

最佳答案

您可能想要预加载或缓存在表 B 上运行的查询的结果。由于表 B 没有太多记录,因此您可以将其加载到 map 中。

您有两个选择:

  1. 预加载整个 B 表并创建某个内容(键)和 val(值)的 Map。然后访问该 map 而不是运行 0.8*65000 查询。如果某物具有许多唯一值并且您的 B 查询搜索其中许多值,那么这将是最有效的。
  2. 将 B 上的每个查询的结果存储在 map 中,并在运行这些查询之前检查该 map 。两次加载相同的数据是没有意义的。如果您在 B 查询中仅使用 something 值的一小部分子集,那么在内存方面会更有效。

在表 B 上添加索引也会有所帮助。

关于java - MySQL select 与 JDBC 的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24171653/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com