Optimisation d'une requête SQL
Bonjour,
je sollicite votre aide à propos d'une requête SQL que je trouve anormalement lente.
La requête est la suivante :
Code:
1 2 3 4 5 6 7
| SELECT m.nom as magasin, p.reference, f.libelle
FROM VENTE_LIGNE vl
INNER JOIN VENTE v ON (v.vente_id = vl.vente_id AND v.date_vente = 20160801)
INNER JOIN MAGASIN m ON (m.magasin_id = v.magasin_id)
INNER JOIN PRODUIT p ON (vl.produit_id = p.produit_id)
INNER JOIN FAMILLE f ON (f.famille_id = p.famille_id)
INNER JOIN SOUS_RAYON s ON (s.sourayon_id = f.sourayon_id) |
Cette requête prend en moyenne 30 secondes à s'exécuter.
Si j'enlève la dernière jointure à la table SOUS_RAYON, ma requête prend moins d'une seconde.
Code:
1 2 3 4 5 6
| SELECT m.nom as magasin, p.reference, f.libelle
FROM VENTE_LIGNE vl
INNER JOIN VENTE v ON (v.vente_id = vl.vente_id AND v.date_vente = 20160801)
INNER JOIN MAGASIN m ON (m.magasin_id = v.magasin_id)
INNER JOIN PRODUIT p ON (vl.produit_id = p.produit_id)
INNER JOIN FAMILLE f ON (f.famille_id = p.famille_id) |
J'ai beau chercher, impossible de comprendre pourquoi...
La base de données est sous MySQL.
Il y a bien des clés étrangères (donc index) sur chaque ID.
Nombre de lignes par table : VENTE_LIGNE (10 000 000), VENTE (38 000), MAGASIN (40), PRODUIT (90 000), FAMILLE (140), SOUS_RAYON (60).
Détails du schéma avec les clés primaires soulignées, et les clés étrangères avec un # :
VENTE (vente_id)
VENTE_LIGNE (vente_ligne_id, #vente_id, #magasin_id, #produit_id)
MAGASIN (magasin_id)
PRODUIT (produit_id, #famille_id)
FAMILLE (famille_id, #sousrayon_id)
SOUS_RAYON (sourayon_id)
La différence entre les 2 requêtes est donc une jointure sur une table de 58 enregistrements.
Je comprends que cela multiplie les données à interroger mais cette différence de temps me parait énorme.
Remarque : ma requête originale est bien plus complexe mais je l'ai simplifiée au maximum pour une meilleure compréhension.
Merci de m'éclairer.