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

Langage SQL Discussion :

Optimisation de requêtes


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 8
    Points
    8
    Par défaut Optimisation de requêtes
    J'ai la requête suivante qui met entre 0,6 et 0,8 seconde pour s'exécuter. Les tables ult_product_descriptions et product_descriptions comptent plus de 500'000 entrées.

    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 SQL_CALC_FOUND_ROWS products.product_id,
                                        IF(shared_descr.product_id IS NOT NULL, shared_descr.product, descr1.product) AS product,
                                        bc.country_code,
                                        100 - ((prices.price * 100) / list_price) AS sales_discount
    FROM cscart_products AS products
    LEFT JOIN cscart_product_descriptions AS descr1 ON descr1.product_id = products.product_id
    AND descr1.lang_code = 'fr'
    LEFT JOIN cscart_product_prices AS prices ON prices.product_id = products.product_id
    AND prices.lower_limit = 1
    INNER JOIN cscart_products_categories AS products_categories ON products_categories.product_id = products.product_id
    INNER JOIN cscart_categories ON cscart_categories.category_id = products_categories.category_id
    AND (cscart_categories.usergroup_ids = ''
         OR FIND_IN_SET(0, cscart_categories.usergroup_ids)
         OR FIND_IN_SET(1, cscart_categories.usergroup_ids))
    AND cscart_categories.status IN ('A',
                                     'H')
    LEFT JOIN cscart_ult_product_descriptions shared_descr ON shared_descr.product_id = products.product_id
    AND shared_descr.company_id = 1
    AND shared_descr.lang_code = 'fr'
    LEFT JOIN cscart_product_block_countries bc ON bc.product_id = products.product_id
    WHERE 1
      AND cscart_categories.company_id = 1
      AND (products.usergroup_ids = ''
           OR FIND_IN_SET(0, products.usergroup_ids)
           OR FIND_IN_SET(1, products.usergroup_ids))
      AND products.status IN ('A')
      AND prices.usergroup_id IN (0,
                                  0,
                                  1)
    GROUP BY products.product_id
    HAVING sales_discount > 0
    ORDER BY product ASC LIMIT 0,
                               8
    Résultat du EXPLAIN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    id	select_type		table					type 		        possible_keys							key		    key_len	ref							rows	     Extra
    1	SIMPLE		prices				ref			usergroup,product_id,lower_limit,usergroup_id	lower_limit	    2		const							12676    Using where; Using temporary; Using filesort
    1	SIMPLE		products				eq_ref		PRIMARY,status							PRIMARY	    3		prod.prices.product_id				1	     Using where
    1	SIMPLE		descr1				eq_ref		PRIMARY,product_id						PRIMARY	    9		prod.prices.product_id,const		1	
    1	SIMPLE		shared_descr			eq_ref		PRIMARY,product_id,company_id				PRIMARY	    13		prod.products.product_id,const,const	1	
    1	SIMPLE		bc					ref			product_id								product_id	    3		prod.products.product_id			1	
    1	SIMPLE		products_categories		ref			PRIMARY,pt							pt		    3		prod.prices.product_id				2	      Using index
    1	SIMPLE		cscart_categories		eq_ref		PRIMARY,c_status,p_category_id				PRIMARY	    3		prod.products_categories.category_id	1	      Using where
    Nom : Optimisation.png
Affichages : 123
Taille : 62,7 Ko

    Comment puis-je optimiser la requête ? Merci

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Bonjour

    Présentez votre requête formatée, tout sur une seule ligne c'est illisible et très pénible à recopier

    il existe des sites qui peuvent vous y aider, par exemple : http://sqlformat.org/

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    L'explain n'est pas exploitable, utilisez une police de pas fixe et collez l'explain dans une image pour que les entêtes de colonnes et les contenus restent alignés

    Quels sont les volumes des différentes tables ?
    Quels sont les index, sont ils discriminants


    En l'attente, essayez de trouver une solution pour remplacer ce morceau de requête non sargable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       AND (products.usergroup_ids = ''
           OR FIND_IN_SET(0, products.usergroup_ids)
           OR FIND_IN_SET(1, products.usergroup_ids))
    Par exemple en faisant une CTE qui contienne ces cas, puis en ajoutant un test d'existence (where exists) vers cette CTE

    Edit : je viens de voir l'explain image, merci c'est lisible

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    A priori seule la table prices nécessite beaucoup d'i/o mais en même temps 0,6 à 0,8 secs vu le nombre de jointures, la présence d'un group by et d'un order by, ça n'a rien d'exagéré.

Discussions similaires

  1. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  2. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50
  3. 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, 20h55
  4. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  5. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09

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