4

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

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

我的数据库位于本地主机。为什么会发生这种情况,什么会如此显着地影响性能?

我怎样才能提高性能?

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

4

2 回答 2

1

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

  1. 您可以尝试在 MYSQL Server 配置中启用查询缓存吗?同样,请参阅:mysql 中的查询缓存

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

于 2013-03-04T12:27:05.037 回答
1

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

如何编写如下查询

从 id in ( id0 , id1, .... idn ) 的用户中选择名称

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

如果 id 的数量很高,则使用一组 id 批量执行相同的查询。

于 2013-05-30T14:23:15.457 回答