这里的要点是:
1.设置query_cache_type = 0;重置查询缓存;
2.在 heidisql(或任何其他客户端 UI)中运行任何查询 --> 执行,例如 45 毫秒
3.使用以下代码运行相同的查询 --> 执行时间为120 毫秒。并且与其他查询的差异呈指数级上升
4.添加/删除的那些根本没有帮助的东西被注释掉了
long sql_execution_time = 0;
String url = "jdbc:mysql://my.net:3306/test";
Class.forName("com.mysql.jdbc.Driver").newInstance();
Properties props = new Properties();
props.setProperty("user", "root");
props.setProperty("password", "pwd");
//kao not recomended
//http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html
//props.setProperty("autoReconnect", "true");
props.setProperty("characterEncoding", "UTF-8");
//props.setProperty("useReadAheadInput", "true");
//props.setProperty("SelectMethod", "direct");
//props.setProperty("responseBuffering", "adaptive");
Connection con = DriverManager.getConnection(url,props);
String sql = "select g.*,t.id_tezaver_obfuscated,group_concat(t.data_source) as taxonomy_src,substring_index(group_concat(t.term order by t.eunis ),',',1) as term,(select count(t2.term) from tezaver t2 where t2.id_tezaver = g.id_tezaver and t2.l2 <> 'la') as c from galery_1 g left join tezaver t on g.id_tezaver = t.id_tezaver and t.l2 = 'la' where 1 = 1 group by g.id_galery order by g.id_galery asc limit 0,18;";
//java.sql.Statement stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
java.sql.Statement stm = con.createStatement();
Calendar cal = Calendar.getInstance();
long startTime = cal.getTimeInMillis();
ResultSet rs = stm.executeQuery(sql);
Calendar cal1 = Calendar.getInstance();
long endTime = cal1.getTimeInMillis();
sql_execution_time = endTime - startTime;
long krneki = sql_execution_time;
startTime = endTime;
stm.close();
con.close();
result = String.valueOf(sql_execution_time);
最佳答案
重要的是要了解您的 Java 代码不仅仅是执行查询。它还做一些其他事情;
- 加载mysql驱动
- 打开连接
- 创建一些对象
您正在对整个事情进行计时,而不仅仅是查询的执行。用户界面的行为可能有所不同。它可能只是计时查询执行所需的时间。
在性能方面比较两者并不符合逻辑。
关于java/mysql/慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8323056/