Bonjour à tous,
Je rencontre un problème de performance sur une requête comportant des sous requêtes imbriquées. Ma requête s'exécute bien en local (avec Mysql 5.7) avec en moyenne un traitement en 1,5 sec. Par contre sur mon serveur de production (en Mysql 5.5) cette requête s'exécute en minimum 30 sec. !
Cela me semble bizarre qu'il y ait autant de différence uniquement entre Mysql 5.7 et 5.5
Voici ma requête :
Voici mes tables :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 SELECT p.*, ( SELECT MIN(pr.price_value) FROM price pr INNER JOIN product2url pu ON pu.url_id = pr.url_id WHERE pu.product_id = p.product_id AND DATE_FORMAT(pr.price_date_add, "%Y-%m-%d") = ( SELECT MAX(DATE_FORMAT(pr2.price_date_add, "%Y-%m-%d")) as dateformat FROM price pr2 INNER JOIN product2url pu2 ON pu2.url_id = pr2.url_id WHERE pu2.product_id = p.product_id AND pr2.price_date_add > '2018-11-01 00:00:00' ) ) AS minprice FROM product p LIMIT 100
Les champs products_id et url_id sont mis en index des tables les contenant.
Je précise que la table price comporte plus de 400 000 lignes ce qui rend cette requête lourde (et donc potentielement lente)
Pour résumer cette requête veut récupérer tous les produits de ma table product et pour chaque produit prendre le prix le plus bas de la date la plus récente dans la table price.
D'après mes tests c'est la sous requête suivante qui rend le tout lent :
Je pense que le WHERE pr2.price_date_add > '2018-11-01 00:00:00' n'est pas interprété ou pris en compte en Mysql 5.5 ce qui me parait bizarre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT MAX(DATE_FORMAT(pr2.price_date_add, "%Y-%m-%d")) as dateformat FROM price pr2 INNER JOIN product2url pu2 ON pu2.url_id = pr2.url_id WHERE pu2.product_id = p.product_id AND pr2.price_date_add > '2018-11-01 00:00:00'
Auriez vous une idée de pourquoi cette lenteur d'exécution en Mysql 5.5 et pas en 5.7 ?
Merci à tous.
Partager