Java JDBCforMySQL的性能对于重复查询来说非常慢

Java JDBCforMySQL的性能对于重复查询来说非常慢,java,mysql,jdbc,Java,Mysql,Jdbc,我有一个程序需要用Java编写大量的查询,选择JDBC来操作mysql数据库。我的代码框架如下: PreparedStatement stmt = conn.preparedStatement( "SELECT name FROM users WHERE id = ?" ) Iterator<String, Double> it = map.entrySet().iterator(); //map is relativelly large, holding

我有一个程序需要用Java编写大量的查询,选择JDBC来操作mysql数据库。我的代码框架如下:

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));
}
我的数据库在本地主机上。为什么会发生这种情况,什么会对性能产生如此显著的影响

如何提高性能


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

一些有助于提高性能的技巧:

  • 可以尝试在MYSQL服务器配置中启用查询缓存吗? 有关详情,请参阅:

  • 是否为此表设置了索引


  • 当您发出一个查询时,每次它通过网络,由db执行并返回给您。为了减少这种往返,可以使用一堆ID执行select查询

    写一个如下的查询怎么样

    从id所在的用户中选择名称(id0、id1、.idn)

    编写一个方法来构造“id”子句,并在语句中设置它并执行它


    如果ID数很高,请逐批使用ID集执行相同的查询。

    1。缓存是启用的,对于同一个查询,第二个查询的mysql响应比前一个查询快得多。2.将索引添加到我将在WHERE子句中用作条件的列(在mycase中为ID和Name)后,查询需要更长的时间。通常一个查询需要15秒左右。该死的…现在情况好多了,谢谢你建议我添加索引,我之前错误地添加了索引,这让事情变得更糟..那太尴尬了…你能分享更新的数据吗?我感兴趣的是它能在多大程度上减少响应时间。大多数情况下,每个查询大约需要5-30毫秒,这取决于结果集,我大约需要1小时来处理大约200000个查询,包括计算工作。但是它仍然需要等待很长时间,因为我的程序实现了一个有迭代步骤的算法。我认为在收敛之前需要7次或更多的迭代。需要7个小时或更长时间才能完成。顺便说一句:我的键是strings(id VARCHAR(10),name VARCHAR(50)),索引一个INT左右的字段会更好吗?我的id类似于“B2094654D069A6F4419C”,必须设置为VARCHAR。如果是这样的话,我将尝试给出一个id的数字,并对数字feilds进行索引
    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