2017-02-22 16 views
-1

私は以下のMySQLクエリを持っており、それは421ms以上となります。これをどのように最適化できますか?このクエリのパフォーマンスを向上させる方法は?

SELECT j.*, c.cl_business_name, c.cl_short_name, 
     m.me_last_name, m.me_first_name, o.co_name, j.jo_deleted_date 
FROM clients c, companies o, jobs j 
LEFT JOIN members m ON j.me_id = m.me_id 
WHERE ? AND j.jo_deleted = ? AND j.co_id = o.co_id AND j.cl_id = c.cl_id 
ORDER BY jo_deleted_date DESC 
+1

インデックスが作成されていますか? – Rahi

+1

空白行の421msは悪くありません。真剣にあなたのテーブルデザインと説明の計画を示すことができます。 –

+1

1. Plsは?を置換した完全なクエリを提供します。 2. Plsは、この照会の説明の結果も提供します。 3.また、クエリのテーブルで定義したカラム名をインデックスのリストとして指定します。 4.半分の実行時間がそれほど悪くないと確信していますか? – Shadow

答えて

-1

この位置では、ジョインの条件(デフォルトではmysqlは内部結合を使用する必要があります)が必要です。これらの企業と顧客との間には関係がありません。このようなものでなければなりません: "INNER JOIN会社o ON.id = c.companiesId"。

クエリを高速化するには、小さいテーブルで最大のものから結合します。

私はその関係がどのように見えるかしか推測できませんが、このクエリは完了するのに役立ちます。

私は想像することができますが、これがこの応答時間の理由です!

SELECT 
    j.*, 
    c.cl_business_name, 
    c.cl_short_name, 
    m.me_last_name, 
    m.me_first_name, 
    o.co_name 
    [, j.jo_deleted_date -> can be ignored, is already in j.* included] 
FROM clients c 
INNER JOIN jobs j ON j.cl_id = c.cl_id AND j.jo_deleted = ? 
INNER JOIN companies o ON j.co_id = o.co_id 
LEFT JOIN members m ON j.me_id = m.me_id 
WHERE ? 
ORDER BY jo_deleted_date DESC 
+0

クエリに構文エラーがあります。 –

+1

明示的な結合構文が暗黙的な構文よりも優れていることに同意します。ただし、クエリのパフォーマンスに関してほとんどの違いはありません。相違がある場合、通常、from節のコンマ演算子に対する明示的な結合の優先順位を理解していないことが原因です。企業とクライアントの間には直接の関係はなく、ジョブテーブルを介してリンクされています。 – Shadow

関連する問題