MySQL, слишком длинный JQBC запрос - PullRequest
0 голосов
/ 06 июня 2011

У меня есть запросы к базе данных, которые стали слишком медленными с моей текущей реализацией. Мне нужно получить все фильмы из базы данных, и для каждого из этих фильмов мне нужны данные их файлов из другой таблицы. Поэтому для каждого фильма я делаю другой запрос. Для каждой записи кандидата мне нужно сделать сравнение с каждым фильмом в базе данных. Должно ли это занять 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 Ответ

4 голосов
/ 06 июня 2011

Должно ли это занять 5-10 секунд для выполнения приблизительно для 500 кандидатов?

Возможно, нет.

Есть два способа улучшить это:

  • Убедитесь, что в столбце movieid есть индекс 10101 *.

  • . Объедините два запроса в один, используя * 1017.*.

Вы, вероятно, должны сделать оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...