4

Javaで書かれた大量のクエリを必要とするプログラムがあり、mysql dbを操作するために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

私のデータベースはlocalhostにあります。なぜこれが起こるのか、何がパフォーマンスに劇的な影響を与えるのでしょうか?

どうすればパフォーマンスを向上させることができますか?

ところで: オブジェクト ステートメント、接続 ... は java.sql で定義されています。私は com.mysql.jdbc バージョンを使用していません。定義がわかりません。

4

2 に答える 2

1

パフォーマンスの向上に役立ついくつかのヒント:

  1. MYSQL Server 構成でクエリ キャッシュを有効にしてみてください。同じことについては、次を参照してください: mysql でのクエリ キャッシング

  2. このテーブルにインデックスは設定されていますか?

于 2013-03-04T12:27:05.037 に答える
1

クエリを発行すると、ネットワークを経由してデータベースによって実行され、戻ってくるたびに。このラウンドトリップを減らすために、一連の ID を使用して選択クエリを実行できます。

以下のようなクエリを書いてみませんか?

id in ( id0 , id1, .... idn) のユーザーから名前を選択

「id」句を構築するメソッドを記述し、ステートメントに設定して実行します。

ID の数が多い場合は、ID のセットを使用して同じクエリをバッチごとに実行します。

于 2013-05-30T14:23:15.457 に答える