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 :

Aide pour Simplifier/optimiser une requête SQL


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Aide pour Simplifier/optimiser une requête SQL
    Bonjour,
    Mon développeur ne maîtrisant pas totalement SQL et ses subtilités, on aurait besoin d'un coup de pouce pour simplifier/optimiser la requete suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DISTINCT video_id, video_type, video_titre, video_description, video_idPartenaire, video_urlMini, video_dateValide, partenaire_valide, partenaire_redirection, 
      ( SELECT COUNT(Y.v_appartient_c_idVideo) AS NbCorresp FROM  lol_v_appartient_c  Y
       WHERE Y.v_appartient_c_idVideo=81 AND Y.v_appartient_c_idCategorie IN (SELECT Z.v_appartient_c_idCategorie FROM lol_v_appartient_c Z WHERE Z.v_appartient_c_idVideo=video_id)) as Compte,
      ( SELECT categorie_singulier FROM lol_categorie,lol_v_appartient_c X
       WHERE X.v_appartient_c_idVideo=video_id AND X.v_appartient_c_default=1 AND categorie_id=X.v_appartient_c_idCategorie ) as categorie_singulier
    FROM lol_categorie,lol_v_appartient_c A,lol_video LEFT JOIN lol_partenaire ON video_idPartenaire=partenaire_id 
    WHERE 
    (A.v_appartient_c_idCategorie IN (SELECT W.v_appartient_c_idCategorie FROM lol_v_appartient_c W WHERE W.v_appartient_c_idVideo=81) AND video_id=A.v_appartient_c_idVideo) AND 
    (video_idPartenaire=0 OR (partenaire_valide=1 AND partenaire_redirection<>1)) AND 
    video_valide=1 AND video_id<>81 AND video_langue='fr' ORDER BY Compte DESC LIMIT 0,14
    Cette requête affiche les 14 premières vidéos ayant le plus de catégories similaires avec "les catégories" de la vidéo visionnée (dans notre exemple la vidéo 81)
    La requête actuelle met 3.06 secondes pour s’exécuter en parcourant 2700 vidéos. On trouve cela un peu long d'ou notre demande sur ce poste. PS: le serveur est plutôt puissant

    Je remercie d'avance l’âme charitable qui tentera de nous aider

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,

    Il faudrait, peut-être, commencer par envisager de changer de développeur .

    Une description a minima des tables concernées et des colonnes sur lesquelles sont censées porter les jointures nous aiderait, ainsi que les index présents sur lesdites tables.

    Le DISTINCT illustre assez bien le manque de maîtrise du codeur, ce limitateur de lignes agit en effet sur l'ensemble des colonnes du n-uplet du SELECT, je doute par conséquent de son utilité ici.

    MySQL apprécie assez peu les sous-requêtes (en termes de performances).

    Je ne prends pas grand risque en affirmant qu'effectivement tout cela est optimisable.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    C'est une horreur cette requête !
    => Envoyer le codeur en formation SQL ! Il peut déjà commencer par apprendre les jointures.

    Le besoin :
    Cette requête affiche les 14 premières vidéos ayant le plus de catégories similaires avec "les catégories" de la vidéo visionnée (dans notre exemple la vidéo 81)
    Décomposons...

    1) Quelles sont les catégories de la vidéo 81 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT v_appartient_c_idCategorie
    FROM lol_v_appartient_c
    WHERE v_appartient_c_idVideo = 81
    2) Quelles sont les vidéos qui ont des catégories en commun avec la vidéo 81 et combien ont-elles de catégories en commun ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT a1.v_appartient_c_idVideo, 
    	COUNT(a1.v_appartient_c_idCategorie) AS nb_categories_communes
    FROM lol_v_appartient_c a1
    INNER JOIN 
    (
    	SELECT v_appartient_c_idCategorie
    	FROM lol_v_appartient_c
    	WHERE v_appartient_c_idVideo = 81
    ) t1 ON t1.v_appartient_c_idCategorie = a1.v_appartient_c_idCategorie
    GROUP BY a1.v_appartient_c_idVideo
    3) On récupère les informations de ces vidéos
    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
    SELECT v.video_id, v.video_type, v.video_titre, v.video_description, 
    	v.video_idPartenaire, v.video_urlMini, v.video_dateValide, 
    	p.partenaire_valide, p.partenaire_redirection
    FROM lol_video v
    LEFT OUTER JOIN lol_partenaire p ON p.partenaire_id = v.video_idPartenaire
    INNER JOIN
    (
    	SELECT a1.v_appartient_c_idVideo, 
    		COUNT(a1.v_appartient_c_idCategorie) AS nb_categories_communes
    	FROM lol_v_appartient_c a1
    	INNER JOIN 
    	(
    		SELECT v_appartient_c_idCategorie
    		FROM lol_v_appartient_c
    		WHERE v_appartient_c_idVideo = 81
    	) t1 ON t1.v_appartient_c_idCategorie = a1.v_appartient_c_idCategorie
    	GROUP BY a1.v_appartient_c_idVideo
    ) t2 ON t2.v_appartient_c_idVideo = v.video_id
    WHERE v.video_idPartenaire = 0 
    	OR 
    	(
    		p.partenaire_valide = 1 
    		AND p.partenaire_redirection <> 1 -- Ne serait-ce pas plutôt <> 0 ?
    	)
    	AND v.video_valide = 1 
    	AND v.video_id <> 81 
    	AND v.video_langue = 'fr'
    ORDER BY t2.nb_categories_communes DESC
    LIMIT 14
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  4. #4
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Bon j'ai eu une aide d'un dev extérieur et voici le résultat de la requête finale :

    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
     
    SELECT 
      lol_video.video_id,
      lol_video.video_type,
      lol_video.video_titre,
      lol_video.video_description,
      lol_video.video_idPartenaire,
      lol_video.video_urlMini,
      lol_video.video_dateValide,
      lol_partenaire.partenaire_valide,
      lol_partenaire.partenaire_redirection,
      ( SELECT COUNT(Y.v_appartient_c_idVideo) AS NbCorresp FROM  lol_v_appartient_c  Y
       WHERE Y.v_appartient_c_idVideo=81 AND Y.v_appartient_c_idCategorie IN (SELECT Z.v_appartient_c_idCategorie FROM lol_v_appartient_c Z WHERE Z.v_appartient_c_idVideo=lol_video.video_id)) as Compte,  
      lol_categorie.categorie_singulier
    FROM
      lol_video
      LEFT JOIN lol_v_appartient_c ON (lol_video.video_id = lol_v_appartient_c.v_appartient_c_idVideo)
      LEFT JOIN lol_categorie ON (lol_v_appartient_c.v_appartient_c_idCategorie = lol_categorie.categorie_id)
      LEFT JOIN lol_partenaire ON (lol_video.video_idPartenaire = lol_partenaire.partenaire_id),
      lol_video lol_video_search
      LEFT JOIN lol_v_appartient_c lol_v_appartient_c_search ON (lol_video_search.video_id = lol_v_appartient_c_search.v_appartient_c_idVideo)
    WHERE
      (lol_video.video_idPartenaire = 0 OR 
      lol_partenaire.partenaire_valide = 1 AND 
      lol_partenaire.partenaire_redirection <> 1) AND 
      lol_video.video_valide = 1 AND 
      lol_video_search.video_id = 81 AND 
      lol_video.video_id <> 81 AND 
      lol_video.video_langue = 'fr' AND 
      lol_v_appartient_c.v_appartient_c_default = 1
    GROUP BY
      lol_video.video_id
       ORDER BY Compte DESC
    LIMIT 14
    Temps d’exécution passé à 0.78 secondes ^^
    Je ne serrai pas vous dire ce qui a changé mais n'aimant pas laisser les sujets sans réponse/remerciement je poste quand même la requête finale

    Merci en tout cas à ceux qui ont tenté d'aider c'est sympa.

Discussions similaires

  1. Demande d'aide pour réalisation d'une requête SQL
    Par etiennegaloup dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/10/2013, 09h54
  2. Optimiser une requête SQL
    Par Colonel-Essaid dans le forum Langage SQL
    Réponses: 1
    Dernier message: 02/05/2013, 17h44
  3. [11g] Besoin d'aide pour écriture d'une requête
    Par telchargement dans le forum SQL
    Réponses: 3
    Dernier message: 19/04/2013, 12h05
  4. Aide pour établissement d'une requête
    Par Virgile59 dans le forum Access
    Réponses: 2
    Dernier message: 28/02/2006, 19h55
  5. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 21h55

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