Optimisation requête SQL avec 8 LEFT JOIN : passer de 12s à <1s ?
-
cedric_du_06
- Messages : 69
- Inscription : mer. mai 15, 2024 7:24 pm
Optimisation requête SQL avec 8 LEFT JOIN : passer de 12s à <1s ?
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 ?
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 ?
-
cedric_du_06
- Messages : 69
- Inscription : mer. mai 15, 2024 7:24 pm
Re: Optimisation requête SQL avec 8 LEFT JOIN : passer de 12s à <1s ?
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 ?
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.
-
cedric_du_06
- Messages : 69
- Inscription : mer. mai 15, 2024 7:24 pm
Re: Optimisation requête SQL avec 8 LEFT JOIN : passer de 12s à <1s ?
MyISAM n'est pas une option (transactions nécessaires). Par contre j'ai testé avec des CTE et ça descend à 4s. Peut mieux faire ?
-
guillaume76
- Messages : 6
- Inscription : jeu. mars 14, 2024 7:25 pm
Re: Optimisation requête SQL avec 8 LEFT JOIN : passer de 12s à <1s ?
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.
RTFM avant de poster (moi le premier)
Re: Optimisation requête SQL avec 8 LEFT JOIN : passer de 12s à <1s ?
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 !