我正在为测验和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才能执行。如何优化它?
答案 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