两个左连接和一个查询MySQL性能问题

时间:2009-10-19 21:11:23

标签: sql mysql performance query-optimization

我正在为测验和quizz结果设计一个项目。所以我有两张桌子:quizz_result和quizz。 quizz在ID上有主键,quizz_result有quiz身份的外键QUIZZ_ID。

下面的查询旨在采用按日期排序的公共测验,其中包含相关信息:如果当前用户(683735)采用此quizz并且具有有效结果(> 0)以及有多少人填写此quizz,直到此时为止。

所以我用两个左连接做了这个简单的查询:

select     
  a.*,  
  COUNT(countt.QUIZZ_ID) SUMFILL
from 
  quizz a
  left join quizz_result countt
    on countt.QUIZZ_ID = a.ID 
group by 
   a.ID

并在这些列上添加了索引: QUIZZ:

ID, (ID, DATE), PUBLIC, (PUBLIC, DATE)

关于quizz_result:

ID, (QUIZZ_ID, USER_ID), QUIZZ_ID, USER_ID, (QUIZZ_ID, QUIZZ_RESULT_ID)

但是当我查询时,它需要大约一分钟。我在QUIZZ_RESULTS中只有34k行,在QUIZZ表中只有120行。

当我对此查询执行EXPLAIN时,我得到了这个:

SELECT TYPE: simple, possible keys:  IDX_PUBLIC,DATE, rows: 34  extra: Using where; Using temporary; Using filesort
SELECT TYPE: simple, possible keys: IDX_QUIZZ_USER,IDX_QUIZZ_RES_RES_QUIZ,IDX_USERID,I..., rows: 1, extra: nothing here
SELECT TYPE: simple, possible keys: IDX_QUIZZ_USER,IDX_QUIZ_RES_RES_QUIZZ,ID_RESULT_ID, rows: 752, extra:  Using index

我不知道如何优化此查询。我明白这一点:

Using where; Using temporary; Using filesort

但是我仍然不知道如何更好地使用它,或者最后一次选择的行数可能很高? 752?

如何优化此查询?

编辑:我只用一个左连接来升级查询,因为它具有相同的长执行时间。

EDIT2:我确实删除了所有内容并且就是这样:这个带有一个查询的简单选择需要1才能执行。如何优化它?

4 个答案:

答案 0 :(得分:1)

尝试从联接中取出一些其他条件。 将它们移动到where子句有时会有所帮助。另外,考虑将核心联接放入它们自己的子查询中,然后使用where子句限制它。

答案 1 :(得分:0)

(USER_ID,QUIZZ_ID,QUIZZ_RESULT_ID)上的索引怎么样,因为它们全都是AND在一起?

答案 2 :(得分:0)

我已将其更改为:

select     
  a.*,  
  COUNT(a.ID) SUMFILL
from 
  quizz a
  left join quizz_result countt
    on countt.QUIZZ_ID = a.ID 
group by 
   a.ID

现在好了。

答案 3 :(得分:0)

试试这个:

SELECT  q.*,
        (
        SELECT  COUNT(*)
        FROM    quizz_results qr
        WHERE   qr.quizz_id = q.id
        ) AS total_played,
        (
        SELECT  result
        FROM    qr.quizz_id = q.id
                AND user_id = 683735
        ) AS current_user_won
FROM    quizz q