针对mysql的JDBC性能反复查询非常慢
问题描述:
我有一个程序需要大量的用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。
答
当您发出查询时,每次它都会经过网络并被db执行并返回给您。为了减少这种往返,你可以用一堆id来执行select查询。
如何写一个查询像下面
从那里身份证件(ID0,ID1,...... IDN)写一个方法来构建“ID”的条款,并将其设置在用户
选择名称声明并执行它。
如果ids数量很多,请按批次逐个执行相同的查询。
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