Любой способ оптимизировать этот запрос MySQL? - PullRequest
0 голосов
/ 25 июня 2009

Это запрос. Меня больше всего интересует, есть ли лучший способ получить материал, для которого я использую GROUP_CONCAT, или это отличный способ получить эти данные Затем я взрываю его и помещаю идентификаторы / имена в массив, а затем использую цикл for для их вывода.

SELECT 
    mov_id, 
    mov_title, 
    GROUP_CONCAT(DISTINCT categories.cat_name) as all_genres, 
    GROUP_CONCAT(DISTINCT cat_id) as all_genres_ids,  
    GROUP_CONCAT(DISTINCT case when gen_dominant = 1 then gen_catid else 0 end) as dominant_genre_ids, 
    GROUP_CONCAT(DISTINCT actors.act_name) as all_actors, 
    GROUP_CONCAT(DISTINCT actors.act_id) as all_actor_ids, 
    mov_desc, 
    mov_added, 
    mov_thumb, 
    mov_hits, 
    mov_numvotes, 
    mov_totalvote, 
    mov_imdb, 
    mov_release, 
    mov_html, 
    mov_type,
    mov_buytickets,
    ep_summary,
    ep_airdate,
    ep_id,
    ep_hits,
    ep_totalNs,
    ep_totalRs,
    mov_rating,
    mov_rating_reason,
    mrate_name,
    dir_id, 
    dir_name
FROM movies
LEFT JOIN _genres
    ON movies.mov_id = _genres.gen_movieid
LEFT JOIN categories
    ON _genres.gen_catid = categories.cat_id
LEFT JOIN _actors
    ON (movies.mov_id = _actors.ac_movid)
LEFT JOIN actors
    ON (_actors.ac_actorid = actors.act_id AND act_famous = 1)
LEFT JOIN directors
    ON movies.mov_director = directors.dir_id
LEFT JOIN movie_ratings
    ON movies.mov_rating = movie_ratings.mrate_id
LEFT JOIN episodes
    ON mov_id = ep_showid AND ep_season = 0 AND ep_num = 0
WHERE mov_id = *MOVIE_ID* AND mov_status = 1 
GROUP BY mov_id

ОБЪЯСНЕНИЕ запроса здесь

альтернативный текст http://www.krayvee.com/o2/explain.gif

Ответы [ 2 ]

1 голос
/ 25 июня 2009

Лично я бы попытался разбить запрос на несколько запросов. В основном я бы порекомендовал удалить объединения актеров и жанров, чтобы вы могли избавиться от всех этих функций group_concat. Затем выполните отдельные запросы, чтобы извлечь эти данные. Не уверен, что это ускорит процесс, но, вероятно, стоит попробовать.

0 голосов
/ 25 июня 2009

Вы в основном сделали декартово произведение между genres, actors, directors, movie_ratings и episodes. Вот почему вы должны использовать DISTINCT внутри вашего GROUP_CONCAT(), потому что предварительно сгруппированный результирующий набор имеет количество строк, равное произведению количества совпадающих строк в каждой связанной таблице.

Обратите внимание, что этот запрос вообще не будет работать в SQL, за исключением того, что вы используете MySQL, который допускает правило с одним значением .

Как и @Kibbee, я обычно рекомендую запускать отдельные запросы в подобных случаях. Не всегда лучше выполнить один запрос. Попробуйте разбить запрос и выполнить профилирование, чтобы быть уверенным.

PS: что? Нет _directors стол? Таким образом, вы не можете представить ход с более чем одним директором? : -)

...