LEFT JOIN的效率

时间:2017-03-13 11:10:05

标签: mysql database join

我通过研究广泛搜索并提高了性能,但我仍然没有尽快得到结果。

我有以下SQL:

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/selectableItemBackground"/>

它在1.8秒内在我的50,000行表上执行。 但是,该页面将使用不同的参数运行此查询60次。 这花了太长时间。

最初我有这个部分: u.form ='Y02GA'&amp;&amp; u.enrolled = '1'

在加入之外,需要4.20秒....我的时间减少了一半以上,但我不禁想到它仍然没有那么高效。

任何指针都感激不尽。 约翰:-)

1 个答案:

答案 0 :(得分: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;

此查询似乎过于复杂。请注意两个小的变化:

  • 删除了数字常量周围的单引号。不要对数字值使用单引号(我假设id是数字)。
  • &&更改为AND。后者是标准的SQL。

一些观察结果:

  • 最里面的子查询将LEFT JOIN变为INNER 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)上的索引。