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 :
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.
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/>'; } ?>
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____ |
Partager