2012-10-15 5 views
2

J'ai un problème pour optimiser une requête MySQL, mais jusqu'à présent, il faut trop de temps pour obtenir un résultat simple limité à 500 enregistrements.MySQL JOIN vs PHP foreach loop

Ma requête est la suivante:

SELECT ou.*, gr.accepted, gr.value 
FROM offer_usermeta ou 
LEFT JOIN gateway_requests AS gr ON ou.customer_id = gr.customer_id 
WHERE ou.customer_id != "" 
AND ou.created >= '2012-10-08 00:00:00' 
AND ou.created <= '2012-10-08 23:59:59' 
ORDER BY ou.created DESC LIMIT 500 

Cette requête prend une minute entière à parcourir peut-être 40 000 dossiers. J'en ai besoin pour récupérer les réponses de la passerelle en fonction de l'identifiant client s'il y en a et que les données semblent correctes avec cette requête, mais j'ai besoin de conseils pour optimiser. Je pensais juste tirer les données séparément et les forcer ensemble comme nécessaire, mais je sais que cela va probablement être beaucoup plus lent ...

Des conseils? (J'utilise codeigniter si quelqu'un y connaît aussi un truc de fantaisie)

+1

S'il vous plaît poster la structure de vos tables. –

Répondre

2

Ajoutez un index sur la colonne created si vous ne l'avez pas déjà fait. La base de données devra aller chercher tous les enregistrements pour faire la order by et correspondre à la condition where, peu importe si vous avez un limit de seulement 500 enregistrements. Après cela essayez

SELECT ou.*, gr.accepted, gr.value 
FROM offer_usermeta ou 
LEFT JOIN gateway_requests AS gr ON ou.customer_id = gr.customer_id 
WHERE ou.created between '2012-10-08 00:00:00' and '2012-10-08 23:59:59' 
ORDER BY ou.created DESC 
LIMIT 500 
+0

"not is null" a donné une erreur et customer_id n'est jamais nul. * EDIT * c'est "n'est pas nul", des erreurs si c'est l'inverse. –

+0

il peut être 'null' dans une 'jointure gauche'. C'est pourquoi vous avez utilisé 'ou.customer_id! =" "', Non? Et j'ai changé la clause where en 'n'est pas nulle' –

+0

'IS NOT NULL' pourrait ne pas être" correct ". Si la colonne est 'NOT NULL', cette condition est inutile. Cela dépend si la colonne peut être 'NULL' et ce qui est utilisé pour une valeur vide. Cela aiderait si @ ark3typ3 affichait la structure des tables. –

0

Vous devriez être en mesure de faire une instruction between, ce qui est plus efficace.

ET ou.created entre '08/10/2012 00:00:00' ET '08/10/2012 23:59:59'

+0

Merci pour l'astuce, il s'est rasé une seconde, mais il est beaucoup plus lisible et convivial donc je l'ai aimé. –