Bonsoir sudtek,
D’une manière générale, pour une bonne performance des requêtes (durée des requêtes < seuil psychologique avant que l’utilisateur ne balance son écran par la fenêtre), on met en oeuvre des index ad-hoc.
Les SGBD SQL exigent soviétiquement que la clé primaire d’une table soit dotée d’un index — dit index primaire — avec la contrainte supplémentaire dans le cas de MySQL que cet index primaire soit nécessairement cluster, et la table MACU n’y échappe pas (à comparer par exemple avec DB2 qui n’impose pas cette contrainte parfaitement stupide).
Peu importe, supposons que l’on définisse ainsi l’index primaire de la table MACU :
(idUE, idModule, idCategorie, idAnneUniversitaire)
Pour répondre à la question :
Pour l'année universitaire 2013 quelle sont les catégories ?
Si cette question est récurrente, on pourra définir un index supplémentaire (heureusement on n’est pas limité dans le nombre d’index !), ainsi composé :
(idAnneUniversitaire, idCategorie)
Le but de la manœuvre étant d’opérer en mode « index only », c'est-à-dire que toutes les données parties prenantes dans la requête soient directement récupérées dans l’index, sans que le SGBD ait besoin de plonger en plus dans la table MACU : s’il fallait aussi afficher les UE et les modules, on aurait intérêt à enrichir ainsi l’index :
(idAnneUniversitaire, idCategorie, idUE, idModule)
Ou peut-être ainsi :
(idAnneUniversitaire, idUE, idModule, idCategorie)
Tout dépend en l’occurrence de la façon dont vous souhaitez présenter les résultats.
N’oubliez pas que, si le nombre d’index n’est pas limité (au moins dans le cas de mon SGBD, à savoir DB2), plus il y a d’index pour une table, plus les mises à jour sont gourmandes.
Autre chose : en général il faut harmoniser l’organisation des clés des index primaires des tables en relation : par exemple il serait maladroit que pour la table MACU on ait l’organisation suivante
(idUE, idModule, idCategorie, idAnneUniversitaire)
Et pour la table EMACU (permutation de idUE et IdModule) :
(idModule, idUE, idCategorie, idAnneUniversitaire, idEleve)
Mais il n’y a pas de secret, en cas de doute sur les choix qu’on est en train de faire (essentiellement en ce qui concerne l’index cluster), on bâtit un prototype de performances et on décortique les résultats fournis par l’instruction EXPLAIN. Il est sûr qu’on peut avoir des choix à faire en fonction des requêtes les plus fréquentes : est-il mieux que l’index primaire de la table EMACU soit le celui-ci :
(idUE, idModule, idCategorie, idAnneUniversitaire, idEleve)
Ou celui-là :
(idEleve, idUE, idModule, idCategorie, idAnneUniversitaire)
La réponse dépend notamment de la structure des requêtes (dont les clauses ORDER BY, HAVING...) et de leur fréquence, d’où la nécessité au besoin de prototyper les performances.
Partager