Page 1 sur 1
Optimisation d'une requête SQL avec 12 JOINs qui prend 8 secondes
Publié : mar. août 27, 2024 5:29 pm
par cedric_du_06
Aidez-moi à sauver cette requête qui massacre notre serveur SQL ! 12 tables jointes, 8 secondes d'exécution... J'ai déjà ajouté des indexes mais ça ne suffit pas. Des idées ? (MySQL 8.0, tables InnoDB)
Re: Optimisation d'une requête SQL avec 12 JOINs qui prend 8 secondes
Publié : mar. août 27, 2024 7:29 pm
par codeur1974
Commence par nous montrer le EXPLAIN. Mais à première vue, 12 JOINs c'est trop. Pense aux vues matérialisées ou au denormalisation partielle. J'ai gagné 75% sur un cas similaire en créant une table agrégée.
Re: Optimisation d'une requête SQL avec 12 JOINs qui prend 8 secondes
Publié : mar. août 27, 2024 8:29 pm
par la_vincent31
Je plussoie. Aussi, vérifie si tous tes JOINs sont nécessaires. Souvent on hérite de requêtes avec des jointures inutiles. Et as-tu essayé FORCE INDEX sur les champs discriminants ?
Re: Optimisation d'une requête SQL avec 12 JOINs qui prend 8 secondes
Publié : mer. août 28, 2024 1:29 am
par cedric_du_06
Merci ! Voici l'EXPLAIN : [détails techniques]. Le problème vient surtout des jointures sur user_actions et transaction_history. @145, comment gères-tu le refresh de ta table agrégée ?
Re: Optimisation d'une requête SQL avec 12 JOINs qui prend 8 secondes
Publié : mer. août 28, 2024 4:29 am
par codeur1974
Pour la table agrégée, j'utilise un trigger AFTER INSERT/UPDATE. Mais sur grosse charge, un job nocturne peut être mieux. Dans ton cas, je vois que le SGBD scanne 200k lignes inutilement... Il faut revoir ta structure !