2009-07-23 2 views
0

Его конкретный запрос появляется в журнале медленных запросов все время для меня. Любой способ повысить его эффективность?Любой способ улучшить этот медленный запрос?

SELECT 
    mov_id, 
    mov_title, 
    GROUP_CONCAT(DISTINCT genres.genre_name) as all_genres, 
    mov_desc, 
    mov_added, 
    mov_thumb, 
    mov_hits, 
    mov_numvotes, 
    mov_totalvote, 
    mov_imdb, 
    mov_release, 
    mov_type 
FROM movies 
LEFT JOIN _genres 
    ON movies.mov_id = _genres.gen_movieid 
LEFT JOIN genres 
    ON _genres.gen_catid = genres.grenre_id 
WHERE mov_status = 1 AND mov_incomplete = 0 AND mov_type = 1 
GROUP BY mov_id 
ORDER BY mov_added DESC 
LIMIT 0, 20; 

Моя главная забота в отношении функции GROUP_CONCAT, который выводит разделенный запятыми список жанров, связанных с конкретным фильмом, который я поставил через цикл и сделать клик-способные ссылки.

alt text

ответ

1

вам нужны названия жанра ли? Если вы можете использовать только genre_id, вы можете исключить второе соединение. (Вы можете заполнить название жанра позже, в пользовательском интерфейсе, используя кеш).

Какие индексы у вас есть?

Вы, вероятно, хотите

create index idx_movies on movies 
    (mov_added, mov_type, mov_status, mov_incomplete) 

и большинство, конечно, присоединиться индекс

create index ind_genres_movies on _genres 
    (gen_mov_id, gen_cat_id) 
+0

Я использую URL-адрес domain.com/genre/genre_name, поэтому идентификаторы не нужны. и да, у меня есть этот индекс. – 2009-07-23 05:35:49

+0

Глядя на вывод EXPLAIN, вы получаете доступ не только к 20 фильмам, но и 5988 из них. Он использует индекс только по статусу. У вас есть указатель на mov_added + mov_type + mov_status + mov_incomplete? – Thilo

+0

Yup, я. Я пытаюсь понять, почему он смотрит на полную таблицу ... а не только на первые 20 пунктов. – 2009-07-23 07:21:22

0

Вы можете разместить вывод EXPLAIN? т. е. поставить EXPLAIN перед SELECT и опубликовать результаты.

У меня было довольно много побед с использованием SELECT STRAIGHT JOIN и заказа таблиц в соответствии с их размером.

STRAIGHT JOIN останавливает mysql угадывает, какой порядок объединяет таблицы и делает это в указанном порядке, поэтому, если вы используете самую маленькую таблицу, вы можете уменьшить количество соединяемых строк.

Я предполагаю, что у вас есть индексы для mov_id, gen_movieid, gen_catid и grenre_id?

+0

Добавлено, и да, да. – 2009-07-23 05:39:48

0

«Использовать временный, используя файловый порт», из группы concat выделяется genres.genre_name.

Попытка получить отдельный столбец без индекса приведет к использованию таблицы temp. Попробуйте добавить индекс в столбец genre_name.

Смежные вопросы