2017-08-01 14 views
-1

私はこれをEXPLIAN:どのように複雑なmysqlクエリを最適化するには?

+----+-------------+-------+------------+--------+-----------------+----------+---------+----------------------+-------+----------+---------------------------------+ 
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref     | rows | filtered | Extra       | 
+----+-------------+-------+------------+--------+-----------------+----------+---------+----------------------+-------+----------+---------------------------------+ 
| 1 | SIMPLE  | ma | NULL  | ALL | NULL   | NULL  | NULL | NULL     | 15545 | 100.00 | Using temporary; Using filesort | 
| 1 | SIMPLE  | mc | NULL  | ref | movie_id  | movie_id | 5  | flask.ma.movie_id |  2 | 100.00 | NULL       | 
| 1 | SIMPLE  | m  | NULL  | eq_ref | PRIMARY,year_id | PRIMARY | 4  | flask.ma.movie_id |  1 | 100.00 | NULL       | 
| 1 | SIMPLE  | a  | NULL  | eq_ref | PRIMARY   | PRIMARY | 4  | flask.ma.area_id  |  1 | 100.00 | Using index      | 
| 1 | SIMPLE  | c  | NULL  | eq_ref | PRIMARY   | PRIMARY | 4  | flask.mc.category_id |  1 | 100.00 | Using index      | 
+----+-------------+-------+------------+--------+-----------------+----------+---------+----------------------+-------+----------+---------------------------------+ 
5 rows in set, 1 warning (0.00 sec) 

どのようにこのクエリを最適化する:

EXPLIAN SELECT m.*,m.id AS mid FROM movie_category mc 
LEFT JOIN movie m ON m.id=mc.movie_id 
RIGHT JOIN movie_area ma ON ma.movie_id=mc.movie_id 
LEFT JOIN area a ON a.id=ma.area_id 
LEFT JOIN category c ON c.id=mc.category_id 
WHERE 1 and ma.area_id>0 
GROUP BY mid 
ORDER BY m.read_count desc LIMIT 0,36; 

が、私はこのような結果を得ましたか。私は本当に何をすべきかを知っていません、私を助けてください。

編集: 説明の結果から、最初の行のエクストラは "一時的な使用; filesortを使用する"は良くありません。また、2行目のエクストラと3行目のエクストラはすべてNULLです。

ps: クエリのスパン0.91秒は非常に悪いです。クエリ速度を証明するためにインデックスを追加する方法。

+1

あなたの質問は意味をなさないので、あなたが何をしようとしているのか明確ではありません。実際にサンプルデータと期待される結果を与えるべきです。 m.read_count'(および 'read_count'のインデックス)によって、どこからムービーが存在するのかを選択することができます(m_movie_id = m.idとma.area_id> 0のmovie_area maを選択してください)。特殊なケースでは完全には同等ではありませんが、これらのケースでは、あなたは現在あなたが現在取得している結果を得ることを望んでいます(あるいは、これらのケースで正確に結果を得るようにクエリを設計しました)。 – Solarflare

+0

@Solarflare私は5つのテーブルからムービーを検索しようとしていました。「http://dotadytt.com/movie/」のように見えます。5つのテーブルには「映画」、「カテゴリ」、「エリア」、「映画エリア」、 'movie_category'。 – XieWilliam

+0

「5つのテーブルからムービーを検索しようとしていました」は何も明らかにしていません。それは実際に*明白だった唯一のものでした:あなたは*クエリーを書こうとしていました - あなたが得たい結果は不明です。 (例: 'select join'に含まれていないテーブルを' left join'テーブルに入れ、 'group by'm.idを使うと、まったく結合しないかのようになります。 )。サンプルデータ(テーブル定義を含む)と予想される出力を指定する必要があります。しかし、おそらくSQLで少し経験を積むためにあなたのデータをちょっとだけプレイするべきです。簡単に始めることができます(たとえば、1回の参加)。 – Solarflare

答えて

1

が関与スキーマを見ることなく、スキーマ

を改善し、私はあなたが非効率的に定義されている多対多マッピングテーブル2(MC、MA)を持っていると仮定します。

ルールhereに従ってください。あなたはいくらかの効率を得るでしょう。

は不要テーブル

categorymovie_categoryを取り除く本当にクエリで使用されるので、クエリから削除されていません。

私はこれが "生成された"クエリだとしますか?その後、世代を少し洗練させてください!