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 GROUP_CONCAT


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut Optimisation requête GROUP_CONCAT
    Bonjour,

    J'ai une base de données MYSQL qui répertorie mes livres et qui comporte plusieurs tables. Je fournis en pièce jointe mon modèle de données.
    Pour avoir des lignes de résultat du style,

    titre categories genres auteurs etc
    -------------------------------------------------------------------
    Titre 1 Categorie 2|Categorie 4 Genre 1|Genre 3 Auteur 1|Auteur 3
    etc

    j'utilise dans ma requête, si nécessaire, GROUP_CONCAT. Pour l'affichage PHP, mon code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    <?php
     
    try
    {
     
    	$bdd = new PDO('mysql:host=localhost;dbname=bibliosql', 'root', '');
     
    }
    catch(Exception $e)
    {
     
            die('Erreur : '.$e->getMessage());
    }
     $debut = microtime(true);
     
    	$reponse = $bdd->query('SELECT L.TITRE AS titre,
    				GROUP_CONCAT(DISTINCT C.NOM_CATEGORIE SEPARATOR "|") AS categories,
    				GROUP_CONCAT(DISTINCT G.NOM_GENRE SEPARATOR "|") AS genres,
    				GROUP_CONCAT(DISTINCT R.NOM_LECTEUR SEPARATOR "|") AS lecteurs,
    				GROUP_CONCAT(DISTINCT CB.NOM_CONTRIBUTEUR SEPARATOR "|") AS contributeurs
    				FROM LIVRE L
    				INNER JOIN CLASSIFIE3 A
    					ON A.ID_LIVRE = L.ID_LIVRE
    				INNER JOIN CATEGORIE C 
    					ON A.ID_CATEGORIE = C.ID_CATEGORIE
    				INNER JOIN THEMATISE T
    					ON T.ID_LIVRE = L.ID_LIVRE
    				INNER JOIN GENRE G
    					ON G.ID_GENRE = T.ID_GENRE
    				INNER JOIN LIT
    					ON LIT.ID_LIVRE = L.ID_LIVRE
    				INNER JOIN LECTEUR R
    					ON R.ID_LECTEUR = LIT.ID_LECTEUR
    				INNER JOIN ECRIT E
    					ON E.ID_LIVRE = L.ID_LIVRE	
    				INNER JOIN CONTRIBUTEURS CB
    					ON CB.ID_CONTRIBUTEUR = E.ID_CONTRIBUTEUR
    				GROUP BY L.id_livre
    				ORDER BY L.TITRE
    				LIMIT 0,500');
     
     $fin= microtime(true);
    echo 'temps total : '.($fin-$debut);
     
     
    $tab_categories = array();
    $tab_genres = array();
    $tab_lecteurs = array();
    $tab_contributeurs = array();
     
    foreach($reponse as $row){
          $titre = $row['titre'];
          $tab_categories = explode('|', $row['categories']);
          $tab_genres = explode('|', $row['genres']);
    	  $tab_lecteurs = explode('|', $row['lecteurs']);
    	  $tab_contributeurs = explode('|', $row['contributeurs']);
     
    	  // affichage du titre
          echo '<br/>'.$titre.'<br/>';
     
          // affichage des catégories
     
          foreach($tab_categories as $categorie)
    	   echo '<strong>'.$categorie.'</strong><br/>';
     
     
          // affichage des genres
     
          foreach($tab_genres as $genre)
    	   echo '<em>'.$genre.'</em><br/>';
     
     
     
          foreach($tab_lecteurs as $lecteur)
    	   echo $lecteur.'<br/>';
     
     
     
          foreach($tab_contributeurs as $contributeur)
    	   echo $contributeur.'<br/>'; 
     
    }
     
     
     ?>
    Ce code m' a été fourni par un contributeur du forum PHP débuter. J'ai calculé le temps d'exécution de ma page : entre 6.90 et 7 secondes. Ce qui me paraît très long alors que mon code n'intègre pas encore l'affichage des éditeurs (pas de GROUP_CONCAC nécessaire), des librairies où a été acheté le livre(idem), des formats (idem), des traducteurs, illustrateurs et préfaceurs (pour ces 3 types de contributeurs, un GROUP_CONCAT sera nécessaire, du moins pour les traducteurs). Le temps d'exécution de ma page risque de s'envoler... Existe-t-il un moyen d'optimiser ma requête finale pour obtenir un temps d'affichage correct ? (sachant qu'au niveau PHP un gain de temps n'est a priori guère possible). Merci d'avance pour votre aide.

    EDIT : j'ai rajouté en pièce jointe la structure détaillée de ma base.

    EDIT2 : j'ai fait un EXPLAIN SELECT pour les spécialistes :

    id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra

    1____ | SIMPLE ____ | R ____ | ALL ____ | PRIMARY ____ | NULL ____ | NULL ____ | NULL ____ | 2____ | Using temporary; Using filesort
    1____ | SIMPLE ____ | C ____ | ALL ____ | PRIMARY ____ | NULL ____ | NULL ____ | NULL ____ | 13____ | Using join buffer
    1____ | SIMPLE ____ | G ____ | ALL ____ | PRIMARY ____ | NULL ____ | NULL ____ | NULL ____ | 32____ | Using join buffer
    1____ | SIMPLE ____ | E ____ | index ____ | PRIMARY ____ | PRIMARY ____ | 16____ | NULL ____ | 1923____ | Using index; Using join buffer
    1____ | SIMPLE ____ | LIT ____ | eq_ref ____ | PRIMARY ____ | PRIMARY ____ | 12____ | bibliosql.R.id_lecteur,bibliosql.E.id_livre ____ | 1____ | Using index
    1____ | SIMPLE ____ | CB ____ | eq_ref ____ | PRIMARY ____ | PRIMARY ____ | 8____ | bibliosql.E.id_contributeur ____ | 1____ |
    1____ | SIMPLE ____ | L ____ | eq_ref ____ | PRIMARY,FK_Livre_ID_editeur_Edite ____ | PRIMARY ____ | 8____ | bibliosql.LIT.id_livre ____ | 1____ | Using where
    1____ | SIMPLE ____ | A ____ | eq_ref ____ | PRIMARY ____ | PRIMARY ____ | 16____ | bibliosql.E.id_livre,bibliosql.C.id_categorie ____ | 1____ | Using where; Using index
    1____ | SIMPLE ____ | T ____ | eq_ref ____ | PRIMARY ____ | PRIMARY ____ | 12____ | bibliosql.G.id_genre,bibliosql.A.id_livre ____ | 1____ | Using where; Using index
    1____ | SIMPLE ____ | EDITEUR ____ | eq_ref ____ | PRIMARY ____ | PRIMARY ____ | 8____ | bibliosql.L.id_editeur ____ | 1____ |

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Bonjour,

    J'ai finalement résolu ma lenteur d'affichage en faisant une optimisation de ma base dans PhpMyAdmin. Ma page s'affiche désormais après seulement 1 seconde

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. optimisation requête-regroupement info
    Par mariobedard dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/09/2005, 15h10
  2. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  3. Optimiser requête utilisant NOT IN
    Par Neilos dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/08/2005, 14h24
  4. optimisation requête
    Par alex2205 dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 09/02/2005, 14h15
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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