2016-07-06 5 views
0

私は深刻な問題があります。私たちのイントラネットは遅くなり、遅くなっています。主な理由の1つは遅いmysql-query(slow-query.logに表示される)のようです。 イントラネットサイトを開くたびに、そのクエリが尋ねられます。 それは次のようになります
複数の結合、max()とグループによる遅いMySQLクエリ

SELECT w.Datetime, w.User_ID, w.Status, e.Lastname 
FROM worktimes AS w 
INNER JOIN employees AS e ON w.User_ID=e.ID 
RIGHT JOIN (SELECT max(Datetime) AS Datetime, User_ID 
      FROM worktimes 
      WHERE Datetime>".$today." // variable of today 0.00 o'clock 
      AND Location='".$llocation['ID']."' // variable of one of 9 locations 
      GROUP BY User_ID) AS v 
     ON v.User_ID=w.User_ID AND w.Datetime=v.Datetime 
ORDER BY e.Lastname; 

worktimesテーブルは、最大200Kの行(試験理由瞬時90K)と13列と幾分大きいです。クエリ全体が3〜9サイクルのループを通過します。

誰かがクエリをより速くする方法を考えていますか?

編集:ここにEXPLAIN-resultが欲しい。
あなたが二回

次のようにあなたがそれを行うことができworktimesを使用する必要がいけない

id select_type  table  type possible_keys key  key_len ref    rows Extra 
1 PRIMARY   <derived2> ALL  NULL   NULL  NULL  NULL    44006 Using temporary; Using filesort 
1 PRIMARY   w   ALL  NULL   NULL  NULL  NULL    92378 Using where 
1 PRIMARY   e   eq_ref PRIMARY,ID  PRIMARY 4  ais_v1.w.User_ID  1 NULL 
2 DERIVED   worktimes ref  Location  Location 767  const    44006 Using index condition; Using where; Using temporary; Using filesort 
+3

クエリの 'EXPLAIN SELECT'を実行できますか? – Daan

+0

さらに詳しい情報がありますか?さて、私は質問を更新します。 –

+0

いいえ、私はそれの前に 'EXPLAIN'と正確なクエリを実行し、ここに結果を掲載することを意味しません。 – Daan

答えて

0

wの表は、必要インデックスはINDEX(Location, Datetime)です。これにより、パフォーマンスが向上します。

+0

クエリ内のインデックスを設定することはできますか?または、データベーステーブルを変更し、フィールドの場所と日時にインデックスを設定する必要がありますか? –

+0

私はデータベーステーブルを変更し、インデックスをフィールドlocationとdatetimeに設定しました。データベースはそれを単独で使用するのでしょうか、それとも私の名前をクエリに含める必要がありますか? –

+0

インデックスの名前は 'DROP INDEX'を実行する場合にのみ有効です。あなたは何もしません;クエリは自動的にインデックスを使用する必要があります。 –

0

SELECT max(w.Datetime) AS Datetime, w.User_ID, w.User_ID, w.Status, e.Lastname 
     FROM worktimes w left outer join employees e 
     on e.User_ID=w.User_ID 
     and w.Datetime>".$today." // variable of today 0.00 o'clock 
    AND w.Location='".$llocation['ID']."' // variable of one of 9 locations 
     GROUP BY w.User_ID 
     ORDER BY e.Lastname; 

それはあなたの既存のクエリよりも高速に実行されます

+0

Erm ...サブクエリ "AS v"を削除すると、v.User_IDまたはv.Datetime;を使用する可能性がなくなります) –

+0

このようにクエリを変更すると、作業時間内の最後のエントリは取得されませんしかし、結果からランダムなものです。それは私がこの複雑なサブクエリを作った理由です。 –

+0

この場合、このクエリの出力を格納する一時テーブルを使用して、手動クエリのトリガを使用してメインテーブルに挿入されたときにこの一時テーブルにデータを挿入することができます –

関連する問題