我有一個程序需要大量的用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對第二個查詢的響應速度比前者快得多。 2.將索引添加到我將用作WHERE子句中的條件(在mycase中的ID和名稱)的列中後,查詢花費更長時間..通常對於一個查詢需要15秒左右。該死...... – zoujyjs 2013-03-05 01:07:31
現在事情變好了,謝謝指教加索引,我錯誤地在之前加了索引,這會讓事情變得更糟......這很尷尬...... – zoujyjs 2013-03-05 01:53:44
你能分享更新的統計數據嗎?我感興趣的是它能縮短響應時間。 – 2013-03-05 04:06:17