[英]Two left joins and one query to MySQL performance problem
我正在设计一个测验和测验结果的项目。 所以我有两个表:quizz_result和quizz。 测验具有ID上的主键,而quizz_result具有用于测验身份的外键QUIZZ_ID。
下面的查询旨在按日期排序并带有相关信息的公共测验:当前用户(683735)是否参加了该测验并获得了有效的结果(> 0),以及有多少人填写了该测验。
所以我用两个左联接做了这个简单的查询:
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行。
当我对此查询进行解释时,我得到了:
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:我确实删除了所有内容,就这样:用一个查询执行此简单选择需要1s的时间来执行。 如何优化呢?
尝试从联接中排除一些其他条件。 将它们移至where子句有时可能会有所帮助。 另外,考虑将核心联接放入自己的子查询中,然后使用where子句限制该联接。
由于(USER_ID,QUIZZ_ID,QUIZZ_RESULT_ID)上的索引如何处理,因为它们都是AND在一起的?
我将其更改为:
select
a.*,
COUNT(a.ID) SUMFILL
from
quizz a
left join quizz_result countt
on countt.QUIZZ_ID = a.ID
group by
a.ID
现在很好。
尝试这个:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.