我正在设计一个用于测验和测验结果的项目。所以我有两个表: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
并在这些列上添加了索引: 测验:
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章
如何优化该查询?
编辑:我已将查询更新为只有一个左连接,因为它具有相同的长执行时间。
编辑2:我确实删除了所有内容,就是这样:这个带有一个查询的简单选择需要 1 秒才能执行。如何优化?
最佳答案
尝试从您的连接中删除一些附加条件。 将它们移至 where 子句有时会有所帮助。另外,考虑将核心连接放入它们自己的子查询中,然后使用 where 子句进行限制。
关于sql - 两次左连接一次查询MySQL性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1591178/