2009-07-23 8 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; 

私の主な関心事は、私がforループに通すとクリック可能なリンクを作る特定のフィルム、関連付けられたジャンルのカンマ区切りのリストを出力GROUP_CONCAT機能、に関してです。

alt text

答えて

1

あなたはジャンル名は必要ですか?あなたがgenre_idだけで行うことができれば、2回目の参加を取り除くことができます。 (後で、UIでキャッシュを使用してジャンル名を入力することもできます)。

どのようなインデックスがありますか?

おそらく

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

私はdomain.com/genre/genre_name urlを使用しているので、IDは必要ありません。 はい、私はそれらのインデックスを持っています。 –

+0

EXPLAIN出力を見ると、トップ20の映画だけでなく、そのうちの5988にアクセスしています。これはステータスのみのインデックスを使用しています。あなたはmov_added + mov_type + mov_status + mov_incompleteにインデックスを持っていますか? – Thilo

+0

うん、やる。私が最初の20項目の代わりに完全な表を見ている理由を理解しようとしています。メモリの制限から –

0

あなたはEXPLAINの出力を投稿することができ、インデックス最も確かに参加しますか?すなわち、EXPLAINをSELECTの前に置き、結果をポストする。

私は、SELECT STRAIGHT JOINを使用して、テーブルのサイズに応じて注文することでかなりの勝利を収めました。

STRAIGHTテーブルを結合しているため停止のMySQLの推測に参加して、あなたが最初にあなたの最も小さいテーブルを使用する場合は接合されている行の量を減らすことができるように指定された順序でそれをしません。

私はあなたがmov_id、gen_movieid、gen_catid、およびgrenre_idにインデックスを持っていると仮定していますか?

+0

追加されました。 –

0

「一時ファイルを使用しています」は、グループconcatのgenres.genre_nameというグループからのものです。

インデックスを持たない列で別名を取得しようとすると、一時表が使用されます。 genre_name列に索引を追加してみてください。

関連する問題