Bonjour,
la situation :
j'ai 2 tables qui enregistre des produits et leurs propriétés : cat_product(id_product,libelle) et cat_product_additionnal_properties(id_product,id_champs,value,lang)
chaque produit à environ 10 à 20 propriétés additionnelles.
La table cat_product_famille enregistre 1 produit dans 1 famille.
La table cat_product contient 20 000 lignes et la table cat_product_additionnal_properties contient 320 000 lignes.
Je souhaite afficher sur une page tous les produits d'une famille avec leurs propriétés, le tout listé dans un tableau, mais je me heurte à des temps d'execution de ma requete trop élevé lorsqu'il y a plus de 400 produits dans une famille.
Et maintenant voici un exemple de requête, cet exemple est particulier car pour cette famille (qui contient 12 000 produits) je dois grouper mes résultats par marque et modèle, qui sont 2 propriétés additionnelles du produit, pour éviter d'afficher 12 000 produits (le group by réduit a 800)
Actuellement cette requete dépasse le délai d'execution. Je cherche donc un moyen d'optimiser cette requete. Est-ce que la logique de ma requête est mauvaise ? Est-ce qu'il y a un moyen d'eviter les jointures ?...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 SELECT cat_product.id_product, i18n.traduction_fr, addpropMarque.value AS marque,addpropModele.value AS modele FROM cat_product_famille LEFT JOIN cat_product ON cat_product_famille.id_product=cat_product.id_product LEFT JOIN i18n ON i18n.shortcut=cat_product.libelle LEFT JOIN cat_product_additionnal_properties addpropMarque ON addpropMarque.id_product=cat_product.id_product LEFT JOIN cat_product_additionnal_properties addpropModele ON addpropModele.id_product=cat_product.id_product WHERE addpropMarque.id_champs=133 AND addpropMarque.lang="fr" AND addpropModele.id_champs=59 AND addpropModele.lang="fr" AND cat_product_famille.id_famille=156 GROUP BY marque,modele
Merci par avance pour votre aide.
(Remarque: je bosse sur un CMS payant, la structure de la bdd n'est pas modifiable)
Partager