针对mysql的JDBC性能反复查询非常慢

问题描述:

我有一个程序需要大量的用Java编写的查询,选择JDBC来操纵mysql db。我的代码框架如下:针对mysql的JDBC性能反复查询非常慢

PreparedStatement stmt = conn.preparedStatement(
      "SELECT name FROM users WHERE id = ?") 
Iterator<String, Double> it = map.entrySet().iterator(); 
//map is relativelly large, holding about 100,000 records, 
//each need to query mysql, and do some computing 
//I record the time consuming of query & computing 
while (it.hasNext()) { 
    String id = it.next().getKey(); 
    stmt.setString(1, id);  //set the missing param with id 
    long queryStart = System.currentTimeMillis(); 
    ResultSet rs = st.executeQuery(); 
    long queryEnd = System.currentTimeMillis(); 
    while (rs.next()) { 
     //computing 
    } 
    rs.close(); 
    st.clearParameters(); 
    long computeEnd = System.currentTimeMillis(); 
    System.out.println(index+" has done..."); 
    System.out.println(" query time: "+ (queryEnd-queryStart)); 
    System.out.println(" compute time: "+ (computeEnd-queryEnd)); 
} 

性能开始时约为100-200循环。但之后它突然下降。

在控制台窗口中的结果打印是:

1 has done... 
    query time: 0 
    compute time: 0 
2 has done... 
    query time: 0 
    compute time: 0 
3 has done... 
    ... 
    ... 
191 has done... 
    query time: 1 
    compute time: 0 
192 has done... 
    query time: 0 
    compute time: 1 
193 has done... 
    query time: 1018 
    compute time: 0 
194 has done... 
    query time: 1142 
    compute time: 0 
195 has done... 
    query time: 1122 
    compute time: 0 

我的数据库在本地主机。为什么会发生这种情况,会对性能产生怎样的影响?

我该如何提高性能?

BTW:对象语句,连接...是在java.sql中定义的,我没有使用com.mysql.jdbc版本,我不知道什么是deffernce。

一些技巧,可以帮助提高性能:

  1. 你能尝试启用在MySQL服务器配置中的查询缓存? 对于同一请参阅:Query Caching in mysql

  2. 是否为此表设置索引?

+0

1.缓存启用,对于同一个查询,mysql对第二个查询的响应速度比前者快得多。 2.将索引添加到我将用作WHERE子句中的条件(在mycase中的ID和名称)的列中后,查询花费更长时间..通常对于一个查询需要15秒左右。该死...... – zoujyjs 2013-03-05 01:07:31

+0

现在事情变好了,谢谢指教加索引,我错误地在之前加了索引,这会让事情变得更糟......这很尴尬...... – zoujyjs 2013-03-05 01:53:44

+0

你能分享更新的统计数据吗?我感兴趣的是它能缩短响应时间。 – 2013-03-05 04:06:17

当您发出查询时,每次它都会经过网络并被db执行并返回给您。为了减少这种往返,你可以用一堆id来执行select查询。

如何写一个查询像下面

从那里身份证件(ID0,ID1,...... IDN)

写一个方法来构建“ID”的条款,并将其设置在用户

选择名称声明并执行它。

如果ids数量很多,请按批次逐个执行相同的查询。