2011-06-06 203 views
0

我得到的數據庫查詢對於我當前的實現來說太慢了。我需要從數據庫中獲取所有電影,並且對於這些電影中的每一部電影,我都需要從另一個表中獲取其文件數據所以對於每部電影我都在做另一個查詢。對於每個候選條目,我需要對數據庫中的每部電影進行比較。這是否需要5-10秒才能執行大約500名候選人?MySQL,JDBC查詢執行時間太長

// 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; 
} 
+0

準備好的陳述的想法是,我們*準備*一個*陳述*一次*重複使用不同的值。 – 2011-06-06 05:53:49

+0

我不想聽起來過於苛刻或輕浮,但這是一些基本的東西。也許某種「關係數據庫簡介」是爲了?那裏有很多優秀的免費資源。我擔心即使你會在這裏得到正確的答案,你仍然會錯過很多你最終需要的基礎。 – Dmitri 2011-06-06 06:19:37

+0

我想增加'光顧',我也不想聲音光顧。 – Dmitri 2011-06-06 06:20:16

回答

4

如果這是服用5-10秒執行大約500的候選人?

可能不是。

有兩種方法來改善這一點:

  • 確保有上file_videomovieid列的索引。

  • 通過使用JOIN將兩個查詢組合成一個。

你可能應該這樣做。

+0

我有這樣的:「SELECT M.movi​​eid,M.title,MF.filename,MF.size,MF.hash,MF.directory FROM movies M,file_video MF WHERE M.movi​​eid = MF.movi​​eid」now I guess我只需要在它周圍放一些java邏輯就可以給我想要的東西。 – 2011-06-06 06:01:00

+0

@aLk,是的,這應該是正確的查詢。 – 2011-06-06 06:05:19

+0

不錯,簡潔的回答! – Bohemian 2011-06-06 06:06:18