如何加快这个SQL查询?

时间:2018-05-01 08:46:08

标签: sql performance subquery

我试图通过PHPmyAdmin从SQL DB中获取数据,但是执行查询需要很长时间。你知道如何加快我的查询速度吗?

我的数据库具有以下结构

表joueurs

| id_joueur |邮件 |

表格配对

| paires.annee | idj1 | idj2 |

非常感谢

/* mail from all players being first memeber of a pair (idj1) 
in 2015, 2016 and 2017 and removing doubles*/

SELECT 
    mail
from 
    joueurs 
where 
    (joueurs.id_joueur in
        (SELECT idj1
        FROM paires
        WHERE  (paires.annee = 2015 OR paires.annee = 2016 OR paires.annee = 2017)
        )
    )
GROUP BY mail
HAVING COUNT(*) > 0

3 个答案:

答案 0 :(得分:1)

我会删除子查询,只删除join两个表。 where条件也可能更好,条件如paires.annee > 2014 and paires.annee < 2018。 但改进它的唯一方法是在表格中添加索引。

SELECT 
    j.mail
FROM
    joueurs j 
JOIN paires p on p.idj1 = j.id_joueur
WHERE p.annee > 2014 and p.annee < 2018  
GROUP BY j.mail
HAVING COUNT(*) > 0

答案 1 :(得分:0)

您可以使用Exists代替in

SELECT 
    j.mail
from 
    joueurs j
where 
   Exists
        (SELECT idj1
        FROM paires
        WHERE  idj1 =j.id_joueur and (paires.annee = 2015 OR paires.annee = 2016 OR paires.annee = 2017  )
        )    
GROUP BY j.mail
HAVING COUNT(*) > 0

修改SQL Server IN vs. EXISTS Performance您可以在此处了解ExistsIN

答案 2 :(得分:0)

我最初的建议是:

select distinct j.mail
from joueurs j
where exists (select 1
              from paires p
              where p.idj1 = j.id_joueur and p.annee in (2015, 2016, 2017)
             );

having子句什么都不做。为了提高性能,您需要paires(idj1, annee)上的索引。

如果这仍然需要很长时间,如果您删除distinct会怎样?结果仍然可以接受吗?