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 de requête MYSQL


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Par défaut Optimisation de requête MYSQL
    Bonjour,

    j'aurai besoin de votre avis pour une optimisation d'une requête pour m'aider dans la meilleure pratique,

    sur une page j'appelle cette table en sortant en boucle les résultats :

    TABLE_NEWS
    > TN_ID
    > TN_M_ID -> identifiant de l'une des tables ci-dessous
    > TN_TYP -> TYP = 1 = TABLE1 / 2 = TABLE2 / 3 = TABLE3 etc...
    > TN_MESS

    TABLE1
    T1_ID etc etc...

    TABLE2
    T2_ID etc etc...

    TABLE3
    T3_ID etc etc...

    Ma question pour optimiser est la suivante :

    Faut-il préférer ce type de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT TN_M_ID, TN_TYP, TN_MESS FROM TABLE_NEWS WHERE ... 
     
    Puis dans la boucle PHP :
     
    SELECT T1_ID ... FROM TABLE1 WHERE T1_ID = TN_M_ID ... LIMIT 1
    Ou bien faire plutôt avec des jointures de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT TN_M_ID, TN_TYP, TN_MESS 
    FROM TABLE_NEWS TN
    LEFT JOIN TABLE1 T1 ON (T1.T1_ID = TN.TN_M_ID && TN.TN_TYP = 1)
    LEFT JOIN TABLE2 T2 ON (T2.T2_ID = TN.TN_M_ID && TN.TN_TYP = 2)
    LEFT JOIN TABLE3 T3 ON (T3.T3_ID = TN.TN_M_ID && TN.TN_TYP = 3)
    LEFT JOIN TABLE4 T4 ON (T4.T4_ID = TN.TN_M_ID && TN.TN_TYP = 4)
    LEFT JOIN TABLE5 T5 ON (T5.T5_ID = TN.TN_M_ID && TN.TN_TYP = 5)
    LEFT JOIN TABLE6 T6 ON (T6.T6_ID = TN.TN_M_ID && TN.TN_TYP = 6)
    et ensuite trier en fonction de ce qui s'affiche (mais ça va chercher dans pas mal de table pour rien, je trouve)...

    ou bien y-a-t-il une sélection conditionnelle que je ne connaisse pas qui puisse permettre de sélectionner une jointure en fonction du TN_TYP

    P.S.: je pose cette question dans un nouveau post car je crois que c'est considéré comme une nouvelle question plutôt

    Je voulais vous remercier par avance du temps que vous prendrez pour me donner votre avis d'optimisation pour ce genre de requête pour avoir la meilleure pratique à l'avenir.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Le plus performant serait sans doute de revoir la modélisation pour mettre en place un héritage qui semble faire défaut :

    Une table mère regroupant les attributs communs, et des tables filles qui contiennent les attributs propre à chaque spécialisation.

    ainsi, vous n'aurez plus qu'une seule jointure à faire tant que vous ne traitez que des données communes .

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Par défaut
    Tout d'abord un grand merci pour votre réponse,

    en fait toute la base de donnée est actuellement dans ce modèle héritage dont vous parlez mais pour ces quelques tables je n'ai pas fonctionné en héritage et je commence à me rendre compte de la bêtise...

    en effet, je suis totalement auto-didacte dans ma formation php / mysql depuis plusieurs années et j'ai découvert au fur et à mesure beaucoup de nouveautés, et je n'ai pas réussis à trouver certaines réponses...

    Prenons un exemple plus simple pour que je comprenne bien

    Si on veut répertorier plusieurs éléments des villes, régions et pays... comme par exemple (spécialité, langue, coordonnées gps etc...)

    dans ce cas précis vous conseillez pour la meilleure optimisation :

    TABLE_VEHICULE -> table des voitures se trouvant dans une ville
    > V_ID
    > V_CAT = 1 = voiture 2 = camion 3 = moto
    > V_MARK
    > V_ID_CITY
    > V_ID_REGION
    > V_ID_COUNTRY

    TABLE_TRANSL_V -> traduction du descriptif d'un véhicule
    > TV_ID
    > TV_ID_V -> mère
    > TV_LG -> 1 = FR, 2 = EN, 3 = IT...
    > TV_DESC -> descriptif du vehicule dans la langue

    TABLE_CIRECO : city region pays
    > C_ID
    > C_CAT : 1 = ville, 2 = region, 3 = pays
    > C_ID_UP : ID d'appartenance à la région pour une ville, ou bien à un pays pour une région

    TABLE_FILLE_C :
    > CF_ID
    > CF_ID_M -> mère
    > CF_SPECIALITE
    > CF_LANG
    > CF_COORDS_LAT
    > CF_COORDS_LNG

    TABLE_TRANSL_C
    > CT_ID
    > CT_ID_M -> mère
    > CT_LG -> 1 = FR, 2 = EN, 3 = IT...
    > CT_TITRE -> titre dans la langue

    Est-ce que ce type de modélisation est considéré comme le plus optimisé ?

    Dans cet exemple, mon modèle de table est actuellement plutôt TABLE_CITY / TABLE_REGION / TABLE_PAYS

    Je pensais que le fait de séparer par exemple ici en trois tables, diminue le nombre d'enregistrement dans chaque table et que les recherches vont plus vite, c'est donc plus rapide d'avoir une table avec beaucoup d'enregistrement mais qui est moins lourdes car les éléments identiques sont dans une table fille ?

    Merci encore de combler mon manque de connaissance dans ce domaine vous m'éclairez beaucoup !! J'ai lu aussi le lien que vous m'avez transmis avec grand intérêt !

Discussions similaires

  1. Optimiser ma requête MySQL
    Par lusitain91 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/01/2015, 22h33
  2. [MySQL] [MySQL] Optimisation de requête
    Par Falistos dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 30/06/2009, 08h51
  3. [MySQL] Optimisation de requêtes MySql
    Par oclone dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 11/07/2008, 11h20
  4. Réponses: 4
    Dernier message: 29/11/2007, 10h56
  5. Optimiser une requête mysql
    Par Raideman dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/09/2007, 21h18

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