2017-03-13 13 views
0

私は研究を通して広範に検索し、パフォーマンスを向上させましたが、私は可能な限り迅速に結果を得られません。LEFT JOINの効率

私は、次のSQLを持っている:

SELECT x.`level`, count(x.`level`) AS TOTAL FROM (
SELECT a.`level` FROM `gharaffa`.`wwlassessments` a 
LEFT JOIN `gharaffa`.`users` u on u.`pupilID` = a.`pupilID` 
WHERE a.`dateAchieved` = (
SELECT MAX(a2.`dateAchieved`) 
FROM `gharaffa`.`wwlassessments` a2 
WHERE a.`pupilID`= a2.`pupilID` && a2.`id`='867' && u.form='Y02GA' && u.enrolled='1') 
)x 
GROUP BY x.`level` 

それは1.8秒で50,000行の私のテーブルの上に実行されます。 しかし、このページでは、異なるパラメータでこのクエリを60回実行します。 これは時間がかかりすぎています。

もともと私はこの部分を持っていた:私は半分以上をしました.... '1' u.form = 'Y02GA' & &は= u.enrolled参加の

外、それは4.20秒かかりました私はまだそれができるほど効率的ではないと思うのを助けることができません。

感謝の言葉をいただきました。

+0

異なるパラメータで一度実行するとどうなるのですか – Strawberry

+0

返されるSQLは何か説明できますか? –

答えて

0

:-) ジョンは、これはあなたのクエリです:

SELECT x.level, count(x.level) AS TOTAL 
FROM (SELECT a.level 
     FROM gharaffa.wwlassessments a LEFT JOIN 
      gharaffa.`users` u 
      on u.`pupilID` = a.`pupilID` 
      WHERE a.dateAchieved = (SELECT MAX(a2.dateAchieved) 
            FROM gharaffa.wwlassessments a2 
            WHERE a.pupilID = a2.pupilID AND 
             a2.id = 867 AND 
             u.form = 'Y02GA' AND 
             u.enrolled = 1 
           ) 
     ) x 
GROUP BY x.level; 

このクエリは、道overcomplicatedようです。ノートには2つの小さな変化があります:

  • 数値定数の回りに単一引用符を削除しました。数値には一重引用符を使用しないでください(数字はidと仮定します)。
  • &&からANDに変更されました。後者は標準SQLです。

いくつかの所見:

  • 最も内側のサブクエリがINNER JOINからLEFT JOINになります。
  • uの条件は、最も内側のWHEREではなく、WHEREの中間にある必要があります。
  • 外部サブクエリは必要ありません。このため

    SELECT a.level, COUNT(*) as TOTAL 
    FROM gharaffa.wwlassessments a JOIN 
        gharaffa.users u 
        ON u.pupilID = a.pupilID 
    WHERE u.form = 'Y02GA' AND 
         u.enrolled = 1 AND 
         a.dateAchieved = (SELECT MAX(a2.dateAchieved) 
             FROM gharaffa.wwlassessments a2 
             WHERE a.pupilID = a2.pupilID AND 
               a2.id = 867 
             ) 
    GROUP BY a.level; 
    

    、あなたがusers(form, enrolled, pupilID)wwlassessments(pupilId, id, level)のインデックスをしたい:

だから、私はこのように書きます。

+0

私は上記のSQLを試しましたが、ハングするだけでmySQLサービスを再起動する必要があります。インデックスが作成されていない可能性がありますか? – Jack

+0

構造を見て、idは実際には整数ではないので、私は変数を取り戻しました。しかし、それは働いていました...しかし、元のバージョンが1.25しかないので、4.05秒かかります...インデックスはまだ建物ですか?彼らはすぐに造りますか?異なるインデックスでより速くなる他のquieriesを同じ時間に使用するとどうなりますか?複数にすることはできますか?どのようなものを使うべきかはどのように分かりますか? – Jack

+0

うわー... OK ...私はあなたが詳細を学ぶ必要がある分野を特定したようです...私はインデックスを追加して、しばらく待っていました...巨大な速度差は....非常に重要です私はこれについてもっと学びます....0 - 0行目を表示(合計1、クエリーが0.0200秒かかった) – Jack