繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM