缓慢的JDBC& Hibernate查询性能(与PhpMyAdmin相比)

时间:2017-03-30 13:20:09

标签: mysql spring performance hibernate jdbc

我正在开发一个Spring MVC / Hibernate Web应用程序,数据库查询速度非常慢。我已经搜索过,但是人们在这里询问的性能问题似乎与我的问题不符(建议包括模型映射或连接池问题)。

无论我使用普通的JDBC还是Hibernate来查询数据库,它都需要相同的时间。为了确保它与Spring框架无关,我编写了这个简单的应用程序:

public class JDBCTest {

  static final String JDBC_DRIVER = ...;  
  static final String DB_URL = ...;
  static final String USER = ...;
  static final String PASS = ...;

  public static void main(String[] args) {
    Connection conn = null;
    Statement stmt = null;
    double time;
    try {
      Class.forName("com.mysql.jdbc.Driver");
      start = System.currentTimeMillis();
      conn = DriverManager.getConnection(DB_URL,USER,PASS);
      System.out.println("Conn. duration: " + (System.currentTimeMillis() - start));
      stmt = conn.createStatement();
      String sql = "SELECT * FROM temperature WHERE SensorId = 1 AND metered >= '2016-09-15 14:00:00' AND metered <= '2016-09-16 20:00:00'";
      start = System.currentTimeMillis();          
      ResultSet rs = stmt.executeQuery(sql);
      System.out.println("Query duration: " + (System.currentTimeMillis() - start));
...

打开连接需要200-300ms(看起来合理),查询需要1500-2000ms。

在PHPMyAdmin中执行完全相同的查询时,它表示查询花了0.0312秒(与使用JDBC的&gt; 1秒相比)。

可能是什么问题?无论它是如上所示的简约JDBC应用程序,使用JDBC还是使用Hibernate的Spring应用程序 - 查询总是花费大致相同的时间。

它似乎与时间戳没有关系,因为即使简单的“SELECT * FROM temperature”查询也比PHPMyAdmin慢很多倍。

1 个答案:

答案 0 :(得分:1)

对于 查询,复合索引是最佳的:

INDEX(SensorId, metered)

为什么查询第二次运行得更快?通常是因为缓存。或者可能是一个驱动程序以递增方式获取行;另一个让他们一下子全部。

如果您想进一步讨论,请提供SHOW CREATE TABLEEXPLAIN SELECT ...;