2017-04-24 3 views
0

Je voudrais réduire le temps de traitement de ma requête SQL (en fait cela dure 10 minutes ...) Je pense que le problème vient des requêtes SQL imbriquées. (désolé pour mon anglais, je suis étudiant français)sql demande trop longtemps ... Comment simplifier?

SELECT DISTINCT `gst.codeAP21`, `gst.email`, `gst.date`, `go.amount` 
FROM globe_statistique 
JOIN globe_customers ON `gst.codeAP21`=`gc.codeAP21` 
JOIN globe_orders ON `gc.ID`=`go.FK_ID_customers` 
WHERE `gst.page` = 'send_order' 
AND `gst.date` = FROM_UNIXTIME(`go.date`,'%%Y-%%m-%%d') 

UNION 

SELECT DISTINCT `gst.codeAP21`, `gst.email`, `gst.date`, '-' 
FROM globe_statistique 
WHERE `gst.page` NOT LIKE 'send_order' " 
AND (`gst.codeAP21`,`gst.date`) NOT IN 
      (SELECT `gst.codeAP21`,`gst.date` FROM globe_statistique 
       WHERE `gst.page`='send_order'); 

Merci

+0

Récrire NOT IN LEFT JOIN. Et tester le passage de NOT LIKE à! =. – jarlh

+0

J'essaie de changer NOT LIKE à! = Mais c'est la même chose, mais je supprime la requête imbriquée et cela fonctionne, donc le problème vient de la requête reposée ... Ma table globe_statistique: 56000 lignes – Gabi

+0

Vous voulez dire que le premier SELECT est le lent? – jarlh

Répondre

0

essayez ceci:

SELECT DISTINCT `gst.codeAP21`, `gst.email`, `gst.date`, `go.amount` 
FROM globe_statistique 
JOIN globe_customers ON `gst.codeAP21`=`gc.codeAP21` 
JOIN globe_orders ON `gc.ID`=`go.FK_ID_customers` 
WHERE `gst.page` = 'send_order' 
AND `gst.date` = FROM_UNIXTIME(`go.date`,'%%Y-%%m-%%d') 

UNION 
SELECT DISTINCT t1.`gst.codeAP21`, t1.`gst.email`, t1.`gst.date`, '-' 
FROM globe_statistique t1 
left join globe_statistique t2 on t1.gst.page =t2.gst.page and t1.gst.date =t2.gst.date and t2.gst.page =send_order 
WHERE `gst.page` <> 'send_order' AND t2.gst.date is null 

Mais je recomment renommer vos noms de colonnes et de supprimer les points.

Utilisez également EXPLAIN pour savoir pourquoi la requête est lente et ajoutez l'index correct

+0

HI! Merci pour la réponse, mais je ne comprends pas la dernière ligne, ce qui a trouvé 'gst.page' <> 'send_order'? – Gabi

+0

@Gabi sould be! = – Jens

+0

Cela fonctionne avec la jointure à gauche mais c'est déjà veryyyyyyyyyy long .. – Gabi

0

essayer d'éviter l'utilisation de distinct. À cette fin, UNION ALL devrait être utilisé. Groupe par à la fin donne le même résultat:

select codeAP21, email, date, amount 
from (--> your query without distinct but with UNION ALL <--) 
group by codeAP21, email, date, amount 

voir: Huge performance difference when using group by vs distinct

+1

Il y a déjà un 'UNION', donc ce sera un' DISTINCT' implicite aussi –

+0

vous avez raison. vous devriez aussi faire un syndicat à la place. Je vais éditer ma réponse – frank