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 d'une requête avec multi-JOIN [MySQL-5.1]


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2016
    Messages : 35
    Points : 28
    Points
    28
    Par défaut Optimisation d'une requête avec multi-JOIN
    Bonjour,

    J'ai une requête multi-join sur ma base MYSQL perso mais le temps d'exécution est extrêmement long.

    Contexte : mon site internet perso de partage de la connaissance http://aleph2at.free.fr

    But : Lister les hommes/peuples avec leur article principal

    En MySQL, je veux obtenir : Hommes.Id, Hommes.Nom, Hommes_Types.Nom, Articles.Id trié sur Hommes.Nom sans tenir compte des accents et des majuscules

    Voici le schéma des tables et des contraintes :
    Nom : Hommes_Liste.jpg
Affichages : 368
Taille : 22,9 Ko

    Voici la requête que j'ai :
    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
    SELECT 
    	hommes.*, 
    	hommes_types.Nom as HommesTypes_Nom, 
    	articles_elements.Articles_Id 
    FROM 
    	hommes 
    	LEFT JOIN hommes_types ON (hommes_types.Id = hommes.Type_Id) 
    	LEFT JOIN articles_elements ON (
    		articles_elements.Elements_Id = hommes.Id 
    		AND articles_elements.Tables_Id = 4 
    		AND articles_elements.Sens = 'ArtDsEl'
    	) 
    	LEFT JOIN articles ON (
    		articles.Id = articles_elements.Articles_Id 
    		AND articles.Types_Id = 2
    	) 
    WHERE 
    	(hommes.Autre = 0)
    Avez-vous une idée pour rendre la requête des hommes/peuples plus rapide ?

    NB1 : la table Hommes ne contient que 918 éléments et la table articles_elements 14932

    NB2 : je fais le tri alphabétique a posteriori

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Difficile de parler de performances sans la description (DDL) des tables et des index
    A priori, vos critères de jointures portent notamment sur les ID, donc ils sont sargables au moins sur ce critère
    Eventuellement, regardez si la colonne articles_elements.Sens prend beaucoup de valeurs distinctes, et si c'est le cas, créez un index avec (articles_elements.Elements_Id + articles_elements.Tables_Id + articles_elements.Sens)

    Autre piste potentielle, encore une fois à priori car sans DDL..., c'est le critère de filtrage (where) : correspond-t-il à un index, est il filtrant ...

    Sinon, quel est le temps de réponse actuel ? vu les volumes minimes, ça ne devrait prendre que très peu de temps même si la requete n'est pas optimale

    Note : vous devriez remplacer hommes.* par la liste des colonnes utiles à votre traitement, un select * est dangereux, car le jour où votre description de table change, le résultat de votre requête change. De plus, il est probable que toutes les colonnes ne soient pas utiles à votre appli, du coup vous transportez inutilement des données, ce qui charge le réseau, nuit aux performances et pénalise les autres utilisateurs.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2016
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    J'ai modifié le hommes.* en une sélection des champs utiles et cela change tout en terme de performance.

    Merci beaucoup.

    Une question supplémentaire : Comment fait on une DDL ?

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Le DDL c'est le Data Definition Language, autrement dit la partie du SQL qui sert à définir le contenant (la base de données, les table-space, les tables, les index etc....)
    Ce sont les ordres tels que CREATE DATABASE, DROP TABLE, ALTER TABLE, qui composent le DDL

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

Discussions similaires

  1. Optimisation d'une requête avec UNION ALL
    Par jgfa9 dans le forum Requêtes
    Réponses: 11
    Dernier message: 01/08/2012, 21h53
  2. Optimisation d'une requête avec jointure multiple
    Par lucas52 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 28/03/2012, 14h36
  3. [SQL] Requête dans une requête...avec des INNER JOIN!
    Par PedroBD dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 06/04/2006, 08h26
  4. une requête avec plusieurs INNER JOIN, cmt faire ?
    Par elhosni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/01/2006, 17h55
  5. optimisation d'une requête avec jointure
    Par champijulie dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/07/2005, 09h45

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