【发布时间】:2009-10-19 21:11:22
【问题描述】:
我正在为测验和测验结果设计一个项目。所以我有两个表:quizz_result 和 quizz。 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?
如何优化这个查询?
编辑:我已将查询更新为只有一个左连接的查询,因为它具有相同的长执行时间。
EDIT2:我确实删除了所有内容,仅此而已:这个带有一个查询的简单选择需要 1 秒才能执行。如何优化?
【问题讨论】:
-
尝试运行 OPTIMIZE TABLE quizz, quizz_result;
-
@Greg 感谢您的提示。我做到了,但时间还是一样
标签: sql mysql performance query-optimization