2016-12-11 18 views
0

私のmysqlビューは何千ものデータで実際には遅いですが、どうすればこの機能を改善できますか?Mysqlビューが非常に遅い

10000sのデータでこのビューをフェッチすると、30秒以上かかります。このビュー表をどのように修正できますか?ユーザーEXPLAIN SELECT AFTER

SELECT 
    i.jo_in_id, 
    j.*, 
    i.jo_in_week_number, 
    i.jo_in_client_ref_no, 
    i.cl_id AS jo_in_cl_id, 
    c.cl_short_name, 
    c.cl_business_name, 
    m.me_first_name, 
    m.me_last_name, 
    m.me_mobile, 
    sk.sk_name, 
    sk.sk_ticketed, 
    ti.ti_id, 
    ta.ta_name, 
    u.un_id, 
    u.un_from, 
    u.un_to, 
    v.ve_name, 
    mp.vmp_name, 
    r.vr_name 
FROM 
    jo_2_no j2n, 
    jo_in_numbers i, 
    jobs j 
LEFT JOIN venues_new v ON j.ve_id = v.ve_id 
LEFT JOIN venues_meeting_place mp ON j.vmp_id = mp.vmp_id 
LEFT JOIN venues_rooms r ON j.vr_id = r.vr_id 
LEFT JOIN clients c ON j.cl_id = c.cl_id 
LEFT JOIN members m ON j.me_id = m.me_id 
LEFT JOIN skills sk ON j.sk_id = sk.sk_id 
LEFT JOIN tasks ta ON j.ta_id = ta.ta_id 
LEFT JOIN crew_tickets ti ON j.sk_id = ti.sk_id AND j.me_id = ti.me_id AND j.jo_time_off < ti.ti_expire 
LEFT JOIN unavailability u ON j.me_id = u.me_id AND ((j.jo_time_on BETWEEN u.un_from AND u.un_to) OR (j.jo_time_on BETWEEN u.un_from AND u.un_to)) 
WHERE 
    j.jo_id = j2n.jo_id 
    AND j2n.jo_in_numbers_id = i.jo_in_id 

あなたのEXPLAINで出力され

enter image description here

+0

結合列にインデックスがありますか?それ以外の場合、ビューの使用をやめることができます。 –

+1

@TimBiegeleisenビューは他のクエリより遅くも高速でもありません。 – arkascha

+0

主な原因は、多数の表を結合するという単純な事実が考えられます。それは遅いです。適切なインデックスを使ってスピードアップを試みることができますが、これまでのところしかできません。少なくとも、最初の3つのテーブルに使用された "カンマ結合"を使用してください。これは、結果セット用に作成された一時テーブルを元に戻します。設定した値が大きいほどクエリが遅くなります。しかし、最終的には、クエリ(表示)を簡略化できるようにデータベースを再設計する必要があります – arkascha

答えて

0

次、私はあなたの結合テーブルtiuがテーブル・スキャン(タイプ:ALL)で読まれていることがわかります。おそらくこれはあなたのパフォーマンスにとって最大の問題です。

あなたは、次のインデックスが作成されていることを確認してください必要があります。これらのテーブルはインデックス検索の代わりに、テーブル・スキャンで動作するように合流役立つはず

ALTER TABLE crew_tickets ADD KEY (sk_id, me_id, ti_expire); 

ALTER TABLE unavailability ADD KEY (me_id, un_from, un_to); 

を。私は彼らもインデックスをカバーするようにアクセスされると思う。

また、古い「コンマ結合」は使用しないでください。特に両方のスタイルを混ぜてはいけません。コンマ結合とJOIN演算子の間の優先順位に驚かされると、それはあなたを噛んでしまいます。例:Can someone help explain why not using a SQL JOIN is bad practice and wrong?またはError on JOIN mysqlを参照してください。

あなたを書くには、このように参加する:

FROM jo_2_no j2n 
INNER JOIN jo_in_numbers i ON j2n.jo_in_numbers_id = i.jo_in_id 
INNER JOIN jobs j ON j.jo_id = j2n.jo_id 
LEFT JOIN venues_new v ON j.ve_id = v.ve_id 
LEFT JOIN venues_meeting_place mp ON j.vmp_id = mp.vmp_id 
LEFT JOIN venues_rooms r ON j.vr_id = r.vr_id 
LEFT JOIN clients c ON j.cl_id = c.cl_id 
LEFT JOIN members m ON j.me_id = m.me_id 
LEFT JOIN skills sk ON j.sk_id = sk.sk_id 
LEFT JOIN tasks ta ON j.ta_id = ta.ta_id 
LEFT JOIN crew_tickets ti ON j.sk_id = ti.sk_id 
    AND j.me_id = ti.me_id AND j.jo_time_off < ti.ti_expire 
LEFT JOIN unavailability u ON j.me_id = u.me_id 
    AND j.jo_time_on BETWEEN u.un_from AND u.un_to 

私はuのために、結合条件で冗長な用語を削除しました。オプティマイザはそのロジックを排除するかもしれませんが、なぜそれを非常にうまく動作させるのでしょうか?

+0

これは私のために働いたありがとうビル。 –