2009-07-23 10 views
0

Sa requête particulière apparaît dans le journal de requête lente tout le temps pour moi. Un moyen d'améliorer son efficacité?Un moyen d'améliorer cette requête lente?

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; 

Ma principale préoccupation est en ce qui concerne la fonction group_concat, qui délivre une liste séparée par des virgules des genres associés au film en particulier, que je mets à travers une boucle et faire des liens cliquable.

alt text

Répondre

1

Avez-vous besoin des noms de genre? Si vous pouvez faire juste avec le genre_id, vous pouvez éliminer la deuxième jointure. (Vous pouvez renseigner le nom du genre plus tard, dans l'interface utilisateur, en utilisant un cache).

Quels index avez-vous?

Vous voulez probablement

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

et certainement l'join index

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

J'utilise domain.com/genre/genre_name url, donc les ID ne sont pas nécessaires. et oui, j'ai ces index. –

+0

En regardant votre sortie EXPLAIN, vous accédez non seulement aux 20 meilleurs films, mais à 5988 d'entre eux. Il utilise un index uniquement sur le statut. Etes-vous sûr d'avoir un index sur mov_added + mov_type + mov_status + mov_incomplete? – Thilo

+0

Ouais, je le fais. Im essayant de comprendre pourquoi son regard sur la table complète ... au lieu de seulement les 20 premiers éléments. –

0

Pouvez-vous poster la sortie EXPLIQUER? c'est-à-dire mettre EXPLAIN devant le SELECT et afficher les résultats.

J'ai eu pas mal de succès en utilisant SELECT STRAIGHT JOIN et en ordonnant les tables en fonction de leur taille. STRAIGHT JOIN empêche mysql de deviner dans quel ordre joindre les tables et le fait dans l'ordre spécifié, donc si vous utilisez votre plus petite table, vous pouvez réduire la quantité de lignes jointes.

Je suppose que vous avez des index sur mov_id, gen_movieid, gen_catid et grenre_id?

+0

Ajouté, et oui je le fais. –

0

Le 'using temporary, using filesort' est issu du groupe concat distinct genres.genre_name.

Si vous tentez d'obtenir une valeur distincte sur une colonne sans index, une table temporaire sera utilisée. Essayez d'ajouter un index sur la colonne genre_name.

Questions connexes