Bonjour,
je suis en train de créer un site multilingue et actuellement j'essaye d'améliorer les performances de mon application.
J'ai une requête qui consomme bcp de ressources, les résultats inutiles peuvent monter jusqu’à 50% !
Passons aux choses sérieuses ^^
Voici le schéma des tables utiles :
Voici la requête MYSQL utilisée pour récupéré les produits correspondant à une catégorie ainsi qu'à ses sous-catégories :
RM : _DEFAULT_LANG = fr
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT * FROM product a LEFT JOIN product_lang b ON a.id_product = b.product_id LEFT JOIN product_category_link c ON a.id_product = c.product_id WHERE c.product_category_id IN (SELECT id_product_category FROM product_category WHERE `left` >= 1 AND `right` <= 58) AND ( language_id LIKE 'en' OR language_id LIKE _DEFAULT_LANG ) ORDER BY id_product asc
Le problème avec cette requête (elle fonctionne mais trop gourmande), c'est la dernière ligne. En effet, je suis sensé récupérer les produits traduits dans la langues choisie par le visiteur. Sauf que si la traduction n'existe pas, il doit quand même récupéré le produit mais avec la langue par défaut (qui sera toujours présente).
Donc avec cette requête, dès que je vais choisir une langue (qui n'est pas celle par défaut), j'aurai à chaque fois des doublons inutiles ( une fois dans la langue choisie si elle existe et une fois dans la langue par défaut). Et quand on commence à avoir bcp de produits, la mémoire allouée est insuffisante pour récupéré tous les résultats de la requête ( +/- 15 000 enregistrements avec un fetchAll()).
Serait-il possible de modifier la requête pour éviter ses doublons et alléger mon fetchAll final ?
Bonne journée![]()
Partager