我在使用MySQL -连接器v5.1.30运行本地mysql应用程序时出现了性能问题(v5.5)
我有两个表,叫做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。除了mysql进程的CPU使用是疯狂的这一事实之外,我认为存在问题的原因是,应用程序具有对不同数据库表运行几乎相同方法的附加功能。这个表的列数与表A(也使用MYISAM)相似,但一个很大的区别是这里没有表B。因此,它的工作方式与上面一样,但不必在迭代第一个表的行时查询第二个表。
另一个表有4500行,迭代时间不到1秒。
因此,表B的嵌套查询似乎导致了问题,但我不确定。我在MySQL方面的经验有限。如果您需要更多的信息,请询问。
发布于 2014-06-11 20:24:28
您可能需要预加载或缓存表B上运行的查询的结果。因为表B没有很多记录,所以可以将其加载到地图中。
你有两个选择:
something有许多唯一值,而B查询搜索其中许多值,这将是最有效的。something值的一小部分,那么内存方面的效率就会更高。在表B中添加索引也会有所帮助。
https://stackoverflow.com/questions/24171653
复制相似问题