首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDBC的MySQL选择性能问题

问JDBC的MySQL选择性能问题
EN

Stack Overflow用户
提问于 2014-06-11 20:06:18
回答 1查看 242关注 0票数 0

我在使用MySQL -连接器v5.1.30运行本地mysql应用程序时出现了性能问题(v5.5)

我有两个表,叫做A和B。我运行这样的东西:

代码语言:javascript
复制
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列中没有索引/键
  • 我使用核心i5和4GB内存运行Ubuntu12.04

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-11 20:24:28

您可能需要预加载或缓存表B上运行的查询的结果。因为表B没有很多记录,所以可以将其加载到地图中。

你有两个选择:

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24171653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档