Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mysql a 100% sur un core

plantage dédié

    19 mars 2011 à 8:44:20

    Bonjour,

    voilà mon petit pb, je suis actuellement hébergé sur un serveur dédié avec 3go de ram et dual core, depuis peu notre serveur dédié plante totalement, tout les services s'arrêtent et seul le hard reboot résout le souci avec les complications pour les clients vu que le site est e-commerce.

    D'abord mon hébergeur m'a annoncé que la machine manquait de mémoire pour notre site ( base de données de 10000 produits), maintenant il me dit que le problème vient d'une de mes pages qui envoi une requête sql qui fait saturer le serveur en gros dès que la fréquentation dépasse les 50 users sans me donner plus d'infos.

    J'ai donc activé les slows queries et not using indexes et j'ai une requête qui réagit en 26s au premier chargement, ensuite elle est mise en cache par mysql, celà peut t'il causer le crash total du dédié ?

    De plus celle-ci est considéré comme not using indexes alors que j'ai mis des index sur toutes les colonnes du where, quelqu'un peut m'expliquer comment déterminer les champs à mettre en index dans une requête plus précisement ?

    Cdt,



    • Partager sur Facebook
    • Partager sur Twitter
      19 mars 2011 à 15:19:00

      on peut voire le code que tu suppose etre a l'origine du plantage ?

      26 seconde, c'est en effet assez important
      • Partager sur Facebook
      • Partager sur Twitter
        19 mars 2011 à 15:37:05

        Oui 26s c'est important mais juste pour la première requête sachant que la base en question comporte 10000 articles

        SELECT SQL_CALC_FOUND_ROWS DISTINCT epf.epf_value, epf.sort_order, epf.epf_id , epf.value_id  
        
                      FROM products p  
                      LEFT JOIN  products_description pd on (p.products_id = pd.products_id)
                      LEFT JOIN products_to_categories p2c on (p.products_id = p2c.products_id)
                      LEFT JOIN categories c on (c.categories_id = p2c.categories_id)
            left join categories_description as cd on (c.categories_id = cd.categories_id and cd.language_id = "1")
            LEFT JOIN  extra_field_values AS epf ON 
                                        (epf.value_id = extra_value_id2 
                                        or epf.value_id = extra_value_id3 
                                        or epf.value_id = extra_value_id4 
                                        or epf.value_id = extra_value_id5 
                                        or epf.value_id = extra_value_id6 
                                        or epf.value_id = extra_value_id8 
                                        or epf.value_id = extra_value_id9
                                        ) and (epf.languages_id = "1")
        
                      WHERE (p2c.categories_id = "90638" or p2c.categories_id = "90639" or p2c.categories_id = "91436" or p2c.categories_id = "91437" or p2c.categories_id = "91438" or p2c.categories_id = "91439" or p2c.categories_id = "91440" or p2c.categories_id = "91441" or p2c.categories_id = "91442" or p2c.categories_id = "93743" or p2c.categories_id = "93441")  AND  p.products_status = "1" AND pd.language_id = "1"
                      GROUP BY epf.epf_value  
                      ORDER BY epf.sort_order, epf.epf_value;
        

        J'ai mis des index sur p2c.categories_id, pd.language_id et p.products_status mais elle est toujours dans les logs not using indexes

        Need help,

        Merci d'avance
        • Partager sur Facebook
        • Partager sur Twitter
          19 mars 2011 à 15:48:06

          Oh bordel, pas mal en effet ;)

          6 jointures pour une seul requete et ce x10000, ca peut planté en effet ;)

          y a surement moyen d'améliorer tout cela je pense, pourrais t on avoir des info supplemntaire sur ce que tu veux afficher, tes tables, ton modele de table,...
          • Partager sur Facebook
          • Partager sur Twitter
            19 mars 2011 à 15:56:54

            Comment puis-je publier mes tables sur le forum ... ?
            • Partager sur Facebook
            • Partager sur Twitter
              19 mars 2011 à 16:13:11

              non il s'agit d'un oscommerce modifié par un prestataire avec qui je ne travaille plus, mais mon souci est de copier coller les tables ça va être un joyeux bordel non ?
              • Partager sur Facebook
              • Partager sur Twitter
                21 mars 2011 à 12:10:49

                Hello,

                Alors j'ai compris une partie du problème du temps de cette requête et j'ai besoin d'optimiser une requête pour limiter les lectures inutiles dans la BDD en espérant que vous pourrez m'aider


                Table Catégories :
                
                Champ 	Type 	Null 	Défaut 	Commentaires
                categories_id 	int(11) 	Non  	  	 
                categories_image 	varchar(64) 	Oui  	NULL  	 
                parent_id 	int(11) 	Non  	0  	 
                sort_order 	int(3) 	Oui  	NULL  	 
                date_added 	datetime 	Oui  	NULL  	 
                last_modified 	datetime 	Oui  	NULL
                


                Table products_to_categories 
                
                Champ 	Type 	Null 	Défaut 	Commentaires
                products_id 	int(11) 	Non  	  	 
                categories_id 	int(11) 	Non
                


                Chaque catégories à un identifiant unique et un parent dans la table catégories, l'identifiant unique est repris autant de fois qu'il y a de produit dans la table products_to_categories

                Ma requête actuelle est dans $subcategories_query utilisée dans une fonction php complète ci-dessous qui récupère toutes les sous-cat d'une catégories mère avec son identifiant ( $parent_id)

                <?php
                function tep_get_subcategories(&$subcategories_array, $parent_id = 0) {
                    $subcategories_query = tep_db_query("select categories_id from " . TABLE_CATEGORIES . " where parent_id = '" . (int)$parent_id . "'");
                    while ($subcategories = tep_db_fetch_array($subcategories_query)) {
                      $subcategories_array[sizeof($subcategories_array)] = $subcategories['categories_id'];
                      if ($subcategories['categories_id'] != $parent_id) {
                        tep_get_subcategories($subcategories_array, $subcategories['categories_id']);
                      }
                    }
                  }
                ?>
                


                Je voudrais lier cette table à products_to_categories pour ne récupérer que les identifiants de catégories contenant des produits car actuellement la fonction parcours toutes les catégories même si elle sont vide et c une partie de la cause des 26s, mais je ne sais comment m'y prendre, j'ai pensé a une sous-requête mais je me heurte à la jointure que je n'arrive pas à écrire.

                Merci d'avance pour votre aide,

                Cdt,
                • Partager sur Facebook
                • Partager sur Twitter
                  21 mars 2011 à 13:02:57

                  OSCommerce est une montagne de merde, bonne chance.

                  Citation : bart0356

                  SELECT SQL_CALC_FOUND_ROWS DISTINCT epf.epf_value, epf.sort_order, epf.epf_id , epf.value_id  
                  
                                FROM products p  
                                LEFT JOIN  products_description pd on (p.products_id = pd.products_id)
                                LEFT JOIN products_to_categories p2c on (p.products_id = p2c.products_id)
                                LEFT JOIN categories c on (c.categories_id = p2c.categories_id)
                      left join categories_description as cd on (c.categories_id = cd.categories_id and cd.language_id = "1")
                      LEFT JOIN  extra_field_values AS epf ON 
                                                  (epf.value_id = extra_value_id2 
                                                  or epf.value_id = extra_value_id3 
                                                  or epf.value_id = extra_value_id4 
                                                  or epf.value_id = extra_value_id5 
                                                  or epf.value_id = extra_value_id6 
                                                  or epf.value_id = extra_value_id8 
                                                  or epf.value_id = extra_value_id9
                                                  ) and (epf.languages_id = "1")
                  
                                WHERE (p2c.categories_id = "90638" or p2c.categories_id = "90639" or p2c.categories_id = "91436" or p2c.categories_id = "91437" or p2c.categories_id = "91438" or p2c.categories_id = "91439" or p2c.categories_id = "91440" or p2c.categories_id = "91441" or p2c.categories_id = "91442" or p2c.categories_id = "93743" or p2c.categories_id = "93441")  AND  p.products_status = "1" AND pd.language_id = "1"
                                GROUP BY epf.epf_value  
                                ORDER BY epf.sort_order, epf.epf_value;
                  


                  La requête est incorrecte : un GROUP BY sans agrégat mélangé à un DISTINCT n'a, en fait, aucun sens, et le résultat est probablement faux.

                  Il faudrait voir ce que tu veux faire exactement.

                  Citation

                  Je voudrais lier cette table à products_to_categories pour ne récupérer que les identifiants de catégories contenant des produits



                  Je te conseille quelque chose comme ça :

                  SELECT category_id FROM categories c
                  WHERE c.parent_id IN (liste)
                  AND EXISTS( SELECT * FROM products_to_categories pc WHERE pc.category_id=c.category_id)
                  

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Mysql a 100% sur un core

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown