IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Optimisation requête multi jointures


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 31
    Points : 36
    Points
    36
    Par défaut Optimisation requête multi jointures
    Bonjour à toutes et à tous,

    Je coinces depuis plusieurs heures sur cette requête et j'ai peur de ne pas m'y connaître assez pour résoudre le problème.

    Ci-dessous la requête que je souhaites executer, mais j'obtiens cette erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MySQL a répondu: Documentation
     
    #1317 - Query execution was interrupted
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT * 
    FROM `produit` 
    LEFT JOIN sous_produit on sous_produit.id_produit = produit.id_produit 
    JOIN produit_sous_rubrique ON produit_sous_rubrique.id_produit = produit.id_produit 
    JOIN produit_photo ON produit_photo.id_produit = produit.id_produit 
    JOIN prod_data_sous_rubriques ON prod_data_sous_rubriques.id_sous_rub = produit_sous_rubrique.id_sous_rub 
    #Le reste on s'en fiche, car d'après mes test le problème est au niveau des jointures. Le bug subsiste toujours
    J'ai simplifié au niveau du select * également, toujours le même soucis ^^ Donc le problème vient de mes jointures ...

    Cette requête est ma requête de recherche de produit, donc en fonction de ma recherche je veux récupérer tous mes produits, les prix des mes produits (table sous_produit), les rubriques de mes produits.
    J'ai vu la notion d'index donc je suppose que c'est par rapport aux clés primaires etc... Dans toutes mes tables j'ai créé la clé primaire et je m'en sert donc dans mes jointures, je suppose que c'est bon.
    En tout cas je ne vois pas qu'est-ce qui cause la lenteur de cette requête.

    Pour info :
    1 produit = (1) sous_produit
    1 produit = (n) produit_photo
    1 produit = (n) produit_sous_rubrique
    1 sous rubrique = (1) rubrique
    1 rubrique = (n) sous_rubrique

    Je vous remercie de votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    --
    -- Structure de la table `produit`
    --
     
    CREATE TABLE IF NOT EXISTS `produit` (
      `id_produit` int(11) NOT NULL AUTO_INCREMENT,
      `nom_prod` varchar(255) NOT NULL,
      `date_creation` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id_produit`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11652 ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    --
    -- Structure de la table `produit_photo`
    --
     
    CREATE TABLE IF NOT EXISTS `produit_photo` (
      `id_produit_photo` int(11) NOT NULL AUTO_INCREMENT,
      `id_produit` int(11) NOT NULL,
      `nom_photo` varchar(255) NOT NULL,
      `id_couleur` int(11) NOT NULL,
      PRIMARY KEY (`id_produit_photo`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=16882 ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    --
    -- Structure de la table `prod_data_rubriques`
    --
     
    CREATE TABLE IF NOT EXISTS `prod_data_rubriques` (
      `id_rub` int(11) NOT NULL AUTO_INCREMENT,
      `nom` varchar(80) NOT NULL,
      PRIMARY KEY (`id_rub`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=85 ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    --
    -- Structure de la table `prod_data_sous_rubriques`
    --
     
    CREATE TABLE IF NOT EXISTS `prod_data_sous_rubriques` (
      `id_sous_rub` int(11) NOT NULL AUTO_INCREMENT,
      `id_rub` int(11) NOT NULL,
      `nom` varchar(80) NOT NULL,
      PRIMARY KEY (`id_sous_rub`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1311 ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    --
    -- Structure de la table `sous_produit`
    --
     
    CREATE TABLE IF NOT EXISTS `sous_produit` (
      `id_coul_prod` int(11) NOT NULL AUTO_INCREMENT,
      `id_produit` int(11) NOT NULL,
      `qte_1` int(11) DEFAULT NULL,
      `prix_achat_1` decimal(20,5) DEFAULT NULL,
      PRIMARY KEY (`id_coul_prod`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='	' AUTO_INCREMENT=41597 ;

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Aucune clé étrangère n'est définie, normal car MyIsam ne le permet pas... d'ailleurs pourquoi utiliser MyIsam...
    Mais il est quand même nécessaire d'indexer ces clés, par exemple créer un index sur sous_produit.id_produit, etc...

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 31
    Points : 36
    Points
    36
    Par défaut
    Bonjour skuatamad,

    Merci beaucoup, apparement ça à l'air de fonctionner juste en ajoutant l'index à id_produit de la table sous_produit (Elle qui posait problème car elle est immense).

    Mais pour bien comprendre, à quoi sert l'index sur id_produit? J'ai résolu le bug en cliquant sur "index" dans phpMyAdmin, ça a créé l'index sur ce champs mais concrètement que s'est il passé?

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Réponse dans le cours de SQLPro :
    http://blog.developpez.com/sqlpro/p7...d-index-ni-de/
    http://sqlpro.developpez.com/cours/quoi-indexer/

    Imaginez que vous alliez à la bibliothèque pour y trouver un livre précis parmi les milliers de livres disponibles. Soit vous parcourez tous les rayons pour le trouver, soit vous cherchez le livre dans l'index disponible à l'accueil et vous allez directement à l'étagère qui contient le livre. Dans un SGBD, c'est pareil : Si le SGBD ne peut pas utiliser un index, il parcourt toute la table et c'est très long si la table est grosse.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut MimiWoOlf.

    Je trouve que ta requête est trop lourde ! Cinq jointures c'est beaucoup trop pour un petit SGBDR comme MySql.
    Le conseil de skuatamad est excellent. En effet, il faut ajouter des index sur les critères de tes jointures.

    Mais ce n'est pas suffisant, car quand tu fais une jointure entre plusieurs tables, il y a un ordre à respecter.
    Il faut toujours commencer par la jointure qui produit le sous-ensemble le plus petit.
    Comme il s'agit d'intersections entre ensembles, tu auras un effet en cascade, et tu auras une performance plus rapide.
    Il faudrait que tu fasses des tests en changeant l'ordre des jointures, jusqu'à ce que tu trouves le temps d'exécution le plus petit.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. Requête multi jointures
    Par drmedia dans le forum Langage SQL
    Réponses: 6
    Dernier message: 22/10/2009, 01h10
  2. Optimisations requête avec jointures
    Par Superskunk dans le forum Requêtes
    Réponses: 1
    Dernier message: 18/10/2009, 12h05
  3. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum Développement
    Réponses: 5
    Dernier message: 18/09/2007, 16h38
  4. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 18/09/2007, 16h38
  5. optimisation requête avec jointures externes
    Par beurtom dans le forum Oracle
    Réponses: 14
    Dernier message: 16/10/2006, 17h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo