2013-03-04 125 views
3

我有一個程序需要大量的用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

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

  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

1

當您發出查詢時,每次它都會經過網絡並被db執行並返回給您。爲了減少這種往返,你可以用一堆id來執行select查詢。

如何寫一個查詢像下面

從那裏身份證件(ID0,ID1,...... IDN)

寫一個方法來構建「ID」的條款,並將其設置在用戶

選擇名稱聲明並執行它。

如果ids數量很多,請按批次逐個執行相同的查詢。