Как ускорить этот SQL-запрос? - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь получить данные из базы данных SQL через PHPmyAdmin, но требуются годы, чтобы извинить мой запрос. У вас есть идеи, как ускорить мой запрос?

Моя БД имеет следующую структуру

Настольные принадлежности

| 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 голосов
/ 01 мая 2018

Я бы удалил подзапрос и просто 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
0 голосов
/ 01 мая 2018

Моя первоначальная рекомендация:

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? Результаты все еще приемлемы?

0 голосов
/ 01 мая 2018

Вы можете использовать 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

EDIT : SQL Server IN и EXISTS Performance здесь вы можете прочитать о Exists и IN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...