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 :

Requête SQL bloquante


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 2
    Par défaut Requête SQL bloquante
    Bonsoir à tous ! Avant toute chose : bonne année 2007 ! Espérons qu'elle soit pleine de surprises et que j'ai plus de problèmes avec mysql >_<

    Pour en venir à mon problème, j'ai une requête SQL assez lourde (elle porte sur des tables déjà bien remplies ^^), qui mêle jointures et requêtes imbriquées. Mon soucis étant qu'elle est tellement conséquente qu'elle me sature complètement ma connexion à la base, et me bloque donc le serveur mysql (du moins pour le login que j'utilise).
    Je me demandais donc si des esprits avisés pouvaient m'aider sur ce coup, ça fait 2 soirées que je m'arrache les cheveux dessus -_-

    Bon je vous met la requête en question (c'est moche désolé) :

    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
    SELECT DISTINCT p1.id_produit, p1.reference, p1.date_parution
    FROM ab.produit p1
    LEFT OUTER JOIN ab.piste p ON p.id_produit = p1.id_produit
    WHERE p.num_support != -1
    AND p1.id_produit NOT IN
      (SELECT DISTINCT s.code_barre
      FROM ab_scpp.scpp_support s
      INNER JOIN ab_scpp.scpp_lien_support sls ON sls.code_barre=s.code_barre
      GROUP BY s.code_barre, nb_support
      HAVING COUNT(DISTINCT num_support) = nb_support 
    OR nb_support IS NULL )
    AND p1.id_label NOT IN
      (SELECT m.id_label FROM ab_scpp.scpp_marque m
      INNER JOIN ab_scpp.fournisseurs f ON f.id_fournisseur=m.id_fournisseur
      WHERE f.mandat='N')
    LIMIT 10 OFFSET 0
    Avec le limit à 10 la requête passe ... dès que j'augmente aux alentours de 100 la requête commence à mettre 30s à s'exécuter :/ Je vous livre le EXPLAIN avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    id 	select_type 	        table 	type            possible_keys 	key 	      key_len   ref 	                rows 	Extra
    1 	PRIMARY 	        p 	index 	        NULL 	        PRIMARY 	15 	NULL 	                57024 	Using where; Using index; Using temporary
    1 	PRIMARY 	        p1 	eq_ref 	        PRIMARY 	PRIMARY 	13 	ab.p.id_produit           1 	Using where
    3 	DEPENDENT SUBQUERY 	m 	ref_or_null 	index_label 	index_label 	 3 	func                      4 	Using where
    3 	DEPENDENT SUBQUERY 	f 	eq_ref         	PRIMARY 	PRIMARY 	 4 	ab_scpp.m.id_fournisseur  1 	Using where
    2 	DEPENDENT SUBQUERY 	sls 	index 	        PRIMARY 	PRIMARY 	19 	NULL 	                47150 	Using index; Using temporary; Using filesort
    2 	DEPENDENT SUBQUERY 	s 	eq_ref 	        PRIMARY 	PRIMARY 	13 	ab_scpp.sls.code_barre 	  1
    Comme vous le voyez, c'est la sous-requête comportant un GROUP BY qui fait très mal ... ma question serait de savoir s'il est possible d'améliorer la requête ou si je dois me contenter de faire un traitement php sur les données récupérées de 2 requêtes sql bien séparées ?

    Si vous avez besoin d'autres précisions il ne faut pas hésiter à me demander ! (pour info je tourne sur du mysql 5.0.27)

    Merci beaucoup d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    Le NOT IN est notoirement mal implémenté... Tu peux remplacer ta grosse sous-requête NOT IN par une sous-requête dans le FROM (qui sera implémentée par une table temporaire) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    FROM ab.produit p1
    LEFT OUTER JOIN ... ab ON ...
    LEFT OUTER JOIN (ss-req) AS tempo 
       ON p1.id_produit = tempo.id_produit
    WHERE tempo.id_produit IS NULL
    ...

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 2
    Par défaut
    Super Antoun ! Merci beaucoup ça marche beaucoup mieux :p Bon je met 47s pour exécuter la requête mais c'est mieux que l'infini >_< Et je vois pas trop comment optimiser plus ... Thanks

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

Discussions similaires

  1. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/07/2024, 15h41
  2. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 19h42
  3. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  4. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26
  5. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37

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