我正在开发一个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慢很多倍。
答案 0 :(得分:1)
对于 查询,此复合索引是最佳的:
INDEX(SensorId, metered)
为什么查询第二次运行得更快?通常是因为缓存。或者可能是一个驱动程序以递增方式获取行;另一个让他们一下子全部。
如果您想进一步讨论,请提供SHOW CREATE TABLE
和EXPLAIN SELECT ...;