Page 1 sur 1

Optimisation requête SQL avec 8 LEFT JOIN : passer de 12s à <1s ?

Publié : mar. sept. 24, 2024 10:51 pm
par cedric_du_06
Je dois joindre 8 tables (entre 50K et 2M lignes chacune) pour un rapport. Ma requête prend 12s même avec des indexes. Des techniques pour gagner un ordre de grandeur ? (MySQL 8.0 InnoDB)

Re: Optimisation requête SQL avec 8 LEFT JOIN : passer de 12s à <1s ?

Publié : mer. sept. 25, 2024 3:51 am
par le_noob62
Déjà, est-ce que toutes les jointures sont vraiment nécessaires ? Souvent on peut pré-agréger des tables avant de joindre. Sinon, as-tu essayé les indexed views ?

Re: Optimisation requête SQL avec 8 LEFT JOIN : passer de 12s à <1s ?

Publié : mer. sept. 25, 2024 5:51 am
par cedric_du_06
Je ne peux pas pré-agréger car j'ai besoin des détails. Les vues indexées ne sont pas supportées sur InnoDB il me semble ?

Re: Optimisation requête SQL avec 8 LEFT JOIN : passer de 12s à <1s ?

Publié : mer. sept. 25, 2024 12:51 pm
par david62
Change ton moteur en MyISAM le temps du rapport ! Ou mieux : extrait les données brutes et fais le traitement dans une appli. 8 JOINs c'est l'enfer pour l'optimiseur.

Re: Optimisation requête SQL avec 8 LEFT JOIN : passer de 12s à <1s ?

Publié : mer. sept. 25, 2024 3:51 pm
par cedric_du_06
MyISAM n'est pas une option (transactions nécessaires). Par contre j'ai testé avec des CTE et ça descend à 4s. Peut mieux faire ?

Re: Optimisation requête SQL avec 8 LEFT JOIN : passer de 12s à <1s ?

Publié : jeu. sept. 26, 2024 1:51 am
par guillaume76
Astuce peu connue : crée une table temporaire avec les IDs dont tu as besoin, puis indexe-la avant tes JOINs. J'ai gagné 70% sur un cas similaire.

Re: Optimisation requête SQL avec 8 LEFT JOIN : passer de 12s à <1s ?

Publié : jeu. sept. 26, 2024 7:51 am
par le_noob62
Si tu es en 8.0, teste aussi SET optimizer_switch='block_nested_loop=off' pour forcer les hash joins. Mais attention à la conso mémoire !