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


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2018
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2018
    Messages : 40
    Points : 18
    Points
    18
    Par défaut Optimisation requête
    Bonjour à tous

    j'ai un un petit souci. j’exécute des requêtes pour me renvoyer des résultat dans le back office de mon site mais c'est très lent. Cela ne vient pas de mon serveur car je suis sur un dédié. Est ce que ce serait une mauvaise écriture de la requête ou bien quel pourrait être le problème ?

    ci dessous mon code. merci pour votre aide

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
            $this->_select .= 'a.`id_product` as id, two.competitor_price as competitor_price, a.`reference` as reference,
                two.competitor as competitor, sa.wholesale_price as wholesale_price,   sa.last_pa_price as last_pa_price ,
                 sa.free_delivery as free_delivery ,
                IF(sa.`price` < two.`competitor_price`, 1, 0) AS `flag`, a.`id_manufacturer` as `manufacturer`, 
                (SELECT COUNT(*) FROM `'._DB_PREFIX_.'product_attribute` WHERE `id_product`=a.`id_product`) as attribute ,';
             $this->_select .= ' i.id_image as id_image, cl.name `name_category`,  mg.`margin` as `margin`,
                mg.`margin_max` as `margin_max`, sa.`price`,
                IF(t.`rate` AND trg.`active` AND t.`active` AND NOT t.`deleted` AND '.(int)Configuration::get('PS_TAX').',
                ROUND(sa.`price`+(t.`rate`/100*sa.`price`), 6), sa.`price`) AS `price_final`, 
                IF(t.`rate` AND trg.`active` AND t.`active`  AND NOT t.`deleted` AND '.(int)Configuration::get('PS_TAX').',
                t.`rate`, 0) as rate, stock.quantity as quantity_total ,IFNULL(lp.`id_product`, 0) as `id_lengow_product`,f.reduction as  discount_amt ';
     
     
             $this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'product_shop` sa ON a.`id_product` = sa.`id_product` 
                AND sa.`id_shop` = '.$id_shop.'  
                LEFT JOIN `'._DB_PREFIX_.'category_lang` cl    ON sa.`id_category_default` = cl.`id_category`
                AND cl.id_shop = '.$id_shop.'
                LEFT JOIN '._DB_PREFIX_.'tax_rules_group trg ON trg.`id_tax_rules_group` = a.`id_tax_rules_group`
                LEFT JOIN '._DB_PREFIX_.'tax t ON t.`id_tax` = a.`id_tax_rules_group`
                LEFT JOIN `'._DB_PREFIX_.'image` i ON i.`id_product` = a.`id_product` AND i.`cover`=1
                LEFT JOIN '._DB_PREFIX_.'twovnbm two ON two.`id_product` = a.`id_product`
                LEFT JOIN '._DB_PREFIX_.'lengow_product lp ON lp.`id_product` = sa.`id_product`   
                LEFT JOIN `'._DB_PREFIX_.'stock_available` stock ON (stock.`id_product` = a.`id_product`) AND stock.id_product_attribute =0
                LEFT JOIN  `' . _DB_PREFIX_ . 'specific_price` f ON (f.`id_product` = sa.`id_product`) AND f.id_product_attribute = 0             
                LEFT JOIN (SELECT sa.`id_product`, IF(t.`rate` AND trg.`active` AND t.`active` AND NOT t.`deleted`
                AND '.(int)Configuration::get('PS_TAX').',
     
                IF(sa.last_pa_price=0,ROUND((two.competitor_price-sa.wholesale_price)*100/two.competitor_price,2),ROUND((two.competitor_price-sa.last_pa_price)*100/two.competitor_price,2) )
     
     
                ,
                two.competitor_price) AS `margin`,
                IF(t.`rate` AND trg.`active` AND t.`active` AND NOT t.`deleted` AND '.(int)Configuration::get('PS_TAX').',
     
     
                 IF(sa.last_pa_price=0,ROUND((two.competitor_price-sa.wholesale_price)*100/two.competitor_price,2),ROUND((two.competitor_price-sa.last_pa_price)*100/two.competitor_price,2) )
     
     
                ,
                two.competitor_price) AS `margin_max`
                FROM `'._DB_PREFIX_.'product` as a
                LEFT JOIN `'._DB_PREFIX_.'product_shop` sa ON a.`id_product` = sa.`id_product`
                AND sa.`id_shop` = '.$id_shop.'
                LEFT JOIN '._DB_PREFIX_.'tax t ON t.`id_tax` = a.`id_tax_rules_group`
                LEFT JOIN '._DB_PREFIX_.'tax_rules_group trg ON trg.`id_tax_rules_group` = a.`id_tax_rules_group`
                LEFT JOIN '._DB_PREFIX_.'twovnbm two ON two.`id_product` = a.`id_product`   
                LEFT JOIN '._DB_PREFIX_.'lengow_product lp ON lp.`id_product` = sa.`id_product`  
                LEFT JOIN  `' . _DB_PREFIX_ . 'specific_price` f ON (f.`id_product` = sa.`id_product`) AND f.id_product_attribute = 0                 
                GROUP BY  a.id_product ) mg ON mg.`id_product` = a.`id_product`                     
            ';
     
     
     
            if (Tools::getValue('refilters')) {
                $this->processResetFilters();
                $this->_default_pagination = (int)Tools::getValue('how_many_show');
                $this->_pagination = array(20, 50, 100, 300);
            }
            $this->_where .= ' AND b.`id_lang` = '.(int)$this->context->language->id.' AND a.`id_product`=two.`id_product`
                 AND b.`id_lang` = cl.`id_lang`
                 AND a.`id_product`=b.`id_product` AND a.`id_product`=sa.`id_product`

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

    Pour pouvoir étudier des problèmes de performances, il faut
    - communiquer la requête telle que présentée au moteur de la base et non pas les bouts de codes qui en assemblent des morceaux
    - formater la requete pour la rendre lisible
    - communiquer le DDL create table et create index
    - donner des éléments statistiques (volumétrie de chaque table, nombre approximatif de valeurs distinctes pour les critères de filtrage, taux de désorganisation)

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 379
    Points : 19 060
    Points
    19 060
    Par défaut
    Salut KIKOU94430.

    Votre code est illisible ! Nous avons besoin d'une requête, telle que MySql va l'exécuter. Or là, il faut deviner.

    Citation Envoyé par Kikou94430
    j’exécute des requêtes pour me renvoyer des résultat dans le back office de mon site mais c'est très lent.
    Qu'est-ce qui est lent ?
    Il se peut que la requête soit rapide, mais vous pouvez avoir un goulot d'étranglement qui fasse que l'obtention du résultat soit lent.

    Citation Envoyé par Kikou94430
    Cela ne vient pas de mon serveur car je suis sur un dédié.
    Comment êtes-vous certain que le problème ne vient pas de votre serveur ?
    Il existe des tas de raisons pouvant plomber les performances de votre application.

    Citation Envoyé par Kikou94430
    Est ce que ce serait une mauvaise écriture de la requête ou bien quel pourrait être le problème ?
    Nous ne sommes pas des devins. Avec si peu d'information, on va émettre des hypothèses qui peuvent être fausses.

    Les performances peuvent venir des points suivants :
    --> virtual private server mal configuré ???
    --> requête trop lourde.
    --> pas d'index sur les clauses where
    --> trop d'utilisateurs au même moment.
    --> mauvais paramétrage du fichier "my.ini".
    --> pas assez de RAM
    --> processeur trop lent
    --> mauvaise modélisation de votre base de données.
    --> volumétrie trop importante.
    ...

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. optimisation requête-regroupement info
    Par mariobedard dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/09/2005, 15h10
  2. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  3. Optimiser requête utilisant NOT IN
    Par Neilos dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/08/2005, 14h24
  4. optimisation requête
    Par alex2205 dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 09/02/2005, 14h15
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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