2011-03-02 4 views
1

J'ai besoin d'acquérir des données à partir d'une table de questions, puis d'OBTENIR des réponses sur le produit. J'ai besoin de la liste de toutes les questions dans une catégorie particulière (un total de 16 catégories sur environ 200 catégories) et ensuite lister les réponses du produit à côté des questions pour un certain ID de produit.Optimisation de la requête mySQL LEFT JOIN

SELECT `questions`.`id`, `questions`.`text`, `questions`.`catalogue_id`, `productanswers`.`answer` 

FROM `questions` 

LEFT JOIN `productanswers` ON `productanswers`.`question_id` = `questions`.`id` 

AND product_id = '2001682' 

WHERE `catalogue_id` IN (1234912,1234913,1234914) 

ORDER BY `catalogue_id` 

qui revient comme je m'attendais à environ 17 résultats. Les questions sans réponse pour ce produit sont remplies avec Null, génial!

Le problème est que la requête prend environ 23 secondes à exécuter: -o rendant impossible une requête complète avec toutes les questions du catalogue.

Comment puis-je optimiser la requête, ou avez-vous d'autres idées?

Merci, Taff

+0

pouvez-vous s'il vous plaît ajouter des colonnes de table et «expliquer» la sortie à la question? – frail

Répondre

3

Ajouter un indice composite (colonne multiple) sur la question_id et product_id ensemble:

ALTER TABLE productanswers ADD KEY(question_id, product_id) 

Note: Vous pouvez changer l'ordre des colonnes dans l'index, selon la sélectivité de question_id vs product_id

Pour en savoir plus sur les indices composites voir le Docs

+1

Eh bien, vous apprenez quelque chose tous les jours! Cela fait une différence de _slight_, il est passé de plus de 23 secondes à 0.0077 ;-) Merci Scrum Meister. – Taff

0

En outre, vous devriez avoir des index sur toutes vos colonnes id, mais je suppose que vous avez cela. Une autre source d'information est l'instruction d'explication: http://dev.mysql.com/doc/refman/5.0/en/using-explain.html

+0

Mes colonnes id sont toutes définies en tant que clé primaire. L'ajout d'un index à la même colonne me donne un avertissement dans phpmyadmin. Analyser le tableau me donne un statut de OK. Que recommanderais-tu? – Taff