MySQL,JDBC查询执行时间太长

时间:2011-06-06 05:40:10

标签: java mysql jdbc

我的数据库查询在我当前的实现中变得太慢了。我需要从数据库中获取所有电影,对于每部电影,我需要从另一个表中获取文件数据。所以对于每部电影,我正在做另一个查询。对于每个候选条目,我需要对数据库中的每个电影进行比较。这应该花费5-10秒来执行大约500名候选人吗?

// get movies with all their versions
private ArrayList<Movie> getDatabaseMovies(Connection conn) throws Exception {
    PreparedStatement getMoviesStmt = conn.prepareStatement("SELECT movieid, title FROM movies", Statement.RETURN_GENERATED_KEYS);
    ArrayList<Movie> movies = new ArrayList<Movie>();
    try {
        ResultSet rs = getMoviesStmt.executeQuery();
        while (rs.next()) {
            Movie movie = new Movie(rs.getString(2), getDatabaseMovieFiles(conn, rs.getInt(1)));
            movies.add(movie);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        getMoviesStmt.close();
    }
    return movies;
}

public ArrayList<MovieFile> getDatabaseMovieFiles(Connection conn, int movieID) throws Exception {
    ArrayList<MovieFile> movieFiles = new ArrayList<MovieFile>();
    PreparedStatement stmt = conn.prepareStatement("SELECT filename, size, hash, directory FROM file_video WHERE movieid = ?");
    try {
        stmt.setInt(1, movieID);
        ResultSet rs = stmt.executeQuery();
        while (rs.next()) {
            MovieFile movieFile = new MovieFile(rs.getString(1), rs.getLong(2), rs.getBytes(3), rs.getString(4));
            movieFiles.add(movieFile);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        stmt.close();
    }

    return movieFiles;
}

1 个答案:

答案 0 :(得分:4)

  

这应该花费5-10秒来执行大约500名候选人吗?

可能不是。

有两种方法可以改善这种情况:

  • 确保movieid的{​​{1}}列上有索引。

  • 使用file_video将两个查询合并为一个。

你可能应该同时做这两件事。