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 des tables et du code?


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 74
    Par défaut Optimisation des tables et du code?
    Bonjour,

    Je suis actuellement à la phase d'étude pour un site internet réalisé en php / MySQL.

    Mon besoin est le suivant :
    Une table utilisateur (avec les infos de l'utilisateur )
    Une table type de musique (avec id_type_music et nom_type_musique)
    Une table intermédiaire reliant les deux tables (id_type_musique et id_utilisateur)

    Ma question est la suivante :
    Quel serait la solution la plus optimisée en terme de temps de réponse et aussi en terme de ressource serveur :

    1 - laisser tel quel
    2 - supprimer la table "type de musique", puis dans le code PHP avoir en "dur" la liste des type de musique avec leurs ID + nom et insérer l'ID dans la table intermediaire
    3 - Solution intermédiaire : supprimer la table "type de musique", ajouter le champ "nom_type_musique" dans la table intermédiaire ce qui nécessite d'avoir des constantes dans le code php pour l'insertion et aucune conditions du type [...] if(id_type_musique=="jazz") then $type="jazz" [...] pour la lecture


    Mes points interrogations :
    La solution 1 me permet de pouvoir rajouter un style de musique rapidement (même si ça ne devrait pas beaucoup bouger) mais cela me fait une table en plus et cela m'oblige aussi à faire une requête avec une jointure du type :
    select t.nom_type_musique
    from type_musique t, intermediaire i
    where i.id_type_musique=t.id_type_musique
    and i.id_client=12504
    Alors que si je supprime la table "type de musique" je n'aurais plus de jointure à faire et j'aurais une table en moins dans ma base. Par contre, php devra prendre la relève. En effet, après avoir reçu la liste des id_type_musique via une requête SQL, il faudra faire un [...] if(id_type_musique=="jazz") then $type="jazz" [...] (et ainsi de suite) ce qui peut prendre de la ressource serveur.
    De plus, cette table ne serait pas la seule (exemple : type_film, type_livre...)

    La solution 3 me semble la plus adaptée sachant que pour l'insertion je n'aurais qu'a récupérer le nom des type de musique via des constantes dans le code et que pour la lecture je n'aurais qu'a afficher le résultat de la requête suivante :
    select i.nom_type_musique
    from intermediaire i
    where i.id_client=12504


    Merci pour le retour que vous pourrez me faire à ce sujet

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    Billets dans le blog
    14
    Par défaut
    La première solution est la meilleure.
    Il ne faut pas avoir peur des jointures, c'est l'opération la plus optimisée dans un SGBD car c'est son boulot principal de joindre des tables pour extraire des résultats.

    Le code du programme utilisateur ne doit pas influer sur la structure de la BDD, c'est au contraire au code de s'adapter à la structure.

    Si tu ne veux pas faire les jointures dans ton code, fais une vue et interroge la vue dans ton code.

    Et au passage, les jointures s'écrivent depuis 1992 avec l'opérateur JOIN ; il serait temps de s'y mettre !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    La première solution est en effet l'idéal.
    Il suffit de bien penser les index.

    Si votre DB doit souvent répondre à "Untel écoute quelles musiques ?" il vous faut l'index id_utilisateur, id_type_musique.
    Si votre DB doit souvent répondre à "Qui écoute telle musique ?" il vous faut l'index id_type_musique, id_utilisateur.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 74
    Par défaut
    Merci pour les réponses que vous avez pu m'apporter je vais suivre vos conseil.

    Et oui effectivement les jointures s'écrivent avec JOIN my fault

    Par contre que pensez vous de cette affirmation :

    #Remplacer une jointure par une sous-requête. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT DISTINCT column1 FROM t1 WHERE t1.column1 IN (
      SELECT column1 FROM t2);
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT t1.column1 FROM t1, t2
      WHERE t1.column1 = t2.column1;
    Qui vient du site de MySQL (http://dev.mysql.com/doc/refman/5.0/...ubqueries.html)

    Faut-il privilégier les sous requêtes plutôt que les jointures et jusqu'à quelle point? cela marche peut-être que pour les requêtes simple?
    Ou bien la jointure avec JOIN reste la plus optimisée par rapport à une sous requêtes même si elle est simple?

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Guizmo95 Voir le message
    Par contre que pensez vous de cette affirmation :

    #Remplacer une jointure par une sous-requête. Par exemple :

    SELECT DISTINCT column1 FROM t1 WHERE t1.column1 IN (
    SELECT column1 FROM t2);

    au lieu de

    SELECT DISTINCT t1.column1 FROM t1, t2
    WHERE t1.column1 = t2.column1;

    Qui vient du site de MySQL (http://dev.mysql.com/doc/refman/5.0/...ubqueries.html)
    Cette mauvaise idée n'est pas flatteuse pour MySQL qui devrait vérifier ce qu'il y a dans sa doc ! Idée saugrenue et syntaxe de jointure obsolète depuis bientôt 20 ans !
    Si SQLPro passe par là, il va encore pouvoir dire tout le mal qu'il pense de MySQL !


    Faut-il privilégier les sous requêtes plutôt que les jointures et jusqu'à quelle point? cela marche peut-être que pour les requêtes simple?
    Ou bien la jointure avec JOIN reste la plus optimisée par rapport à une sous requêtes même si elle est simple?
    Je crois que ma remarque précédente répond à la question non ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 74
    Par défaut
    ok ok, donc prioriser JOIN et utiliser les sous requêtes que lorsqu'on ne peux pas faire autrement .

    Moi qui pensais pouvoir faire confiance au site de MySQL

    L'optimisation de BDD et de requête m'intéresse mais du coup je ne sais pas où chercher vu que même MySQL ne donne pas toujours de bon conseils.

    Avez vous un ouvrage ou lien à me conseiller pour que je puisse approfondir?

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

Discussions similaires

  1. Dans quelle table system le code des SP ?
    Par ZERS dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/05/2006, 15h06
  2. Optimisation d'une base avec des tables liés
    Par snoopy69 dans le forum Access
    Réponses: 2
    Dernier message: 28/04/2006, 09h11
  3. lier des tables par le code
    Par karimspace dans le forum Contribuez
    Réponses: 5
    Dernier message: 20/03/2006, 11h28
  4. Optimisation des tables
    Par le-roy_a dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 24/01/2005, 10h04

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