Optimisation d'une requête SQL avec 12 JOINs qui prend 8 secondes

MySQL, PostgreSQL, requetes, optimisation
cedric_du_06
Messages : 69
Inscription : mer. mai 15, 2024 7:24 pm

Optimisation d'une requête SQL avec 12 JOINs qui prend 8 secondes

Message 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)
codeur1974
Messages : 185
Inscription : dim. mars 17, 2024 7:24 pm

Re: Optimisation d'une requête SQL avec 12 JOINs qui prend 8 secondes

Message 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.
la_vincent31
Messages : 42
Inscription : sam. juil. 06, 2024 7:25 pm

Re: Optimisation d'une requête SQL avec 12 JOINs qui prend 8 secondes

Message 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 ?
cedric_du_06
Messages : 69
Inscription : mer. mai 15, 2024 7:24 pm

Re: Optimisation d'une requête SQL avec 12 JOINs qui prend 8 secondes

Message 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 ?
codeur1974
Messages : 185
Inscription : dim. mars 17, 2024 7:24 pm

Re: Optimisation d'une requête SQL avec 12 JOINs qui prend 8 secondes

Message 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 !
Répondre