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 関数に関するものです。これを for ループに通し、クリック可能なリンクを作成します。

代替テキスト

4

3 に答える 3

1

ジャンル名は必要ですか?ジャンル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)
于 2009-07-23T05:22:15.087 に答える
0

「一時ファイルソートを使用して」は、グループ concat 個別のgenre_name.genre_name からのものです。

インデックスのない列で個別を取得しようとすると、一時テーブルが使用されます。ジャンル名列にインデックスを追加してみてください。

于 2009-08-09T23:42:38.357 に答える
0

EXPLAIN の出力を投稿できますか? つまり、EXPLAIN を SELECT の前に置き、結果を投稿します。

SELECT STRAIGHT JOIN を使用し、サイズに応じてテーブルを並べ替えることで、かなりの数の勝利を収めました。

STRAIGHT JOIN は、mysql がテーブルを結合する順序を推測するのを停止し、指定された順序で実行するため、最初に最小のテーブルを使用すると、結合される行の量を減らすことができます。

mov_id、gen_movieid、gen_catid、grenre_id にインデックスがあると思いますか?

于 2009-07-23T05:22:20.623 に答える