java/mysql/slow

java/mysql/slow,java,mysql,Java,Mysql,这里的要点是: 1.设置查询\缓存\类型=0;重置查询缓存 2.在Heidisql或任何其他客户端用户界面->执行中运行任何查询,例如45毫秒 3.使用下面的代码运行相同的查询->执行120毫秒。与其他查询相比,差异呈指数增长 4.添加/删除的那些毫无帮助的内容被注释掉了 long sql_execution_time = 0; String url = "jdbc:mysql://my.net:3306/test"; Class.forName("com.

这里的要点是:

1.设置查询\缓存\类型=0;重置查询缓存

2.在Heidisql或任何其他客户端用户界面->执行中运行任何查询,例如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驱动程序 打开连接 创建一些对象 您正在对整个过程进行计时,而不仅仅是查询的执行。用户界面的行为可能有所不同。它可能只是计时查询执行所需的时间

就性能而言,将两者进行比较并不合乎逻辑

1.System.currentTimeMillis不会改变任何东西 2.在jvm重新启动后立即执行相同的操作 3.例如:

两个SQL,heidisql 0.093秒,java 0.9秒调用存储过程,因此没有两个调用

选择g.*,t.id\U tezaver\U obfuscated,group\U concatt.data\U source作为分类法\U src,SUBSTRING\U INDEXgroup\U concatt.term order by t.eunis,',',1作为术语,从tezaver t2中选择countt2.term,其中t2.id_tezaver=g.id_tezaver和t2.l2'la'作为c,从galery_1g中选择c.id_tezaver=t.id_tezaver=t.id_tezaver和t.l2='la',其中1=1按g.id_galery顺序按g.id_galery desc LIMIT 0,18分组; 选择已找到的行


3.加载mysql驱动程序-在示例中,是的,在现实世界中,连接拉取不算,连接打开-它已经打开,一些对象-mybe.

作为旁注:您可以使用System.currentTimeMillis进行计时,而不是总是创建新的日历实例。关闭结果集,语句和连接,并将所有三个都设置为null,所有这些都在finally块中。您可能有内存泄漏;-顺便说一句,在JVM重新启动后,第一次的查询速度是否也很慢?您是否可以发布另一个明显慢的查询?>1。System.currentTimeMillis不会更改任何内容2。忘了这一部分吧,我不明白注册者怎么能平等地提交、写作。。。。