Jump to content
pppplus

Lenteur Suppression produits

Recommended Posts

Je suis en train de supprimer des produits de ma boutique, et c'est d'une lenteur abominable !
J'ai 7000 produits environ, et en supprimer 1 prend des plombes.

PS 1.7.6.1

Je viens de regarder ce qui ralentit :
Quand on supprime un article, tous les articles de la catégories sont impactés (reclassés) OK, normal, pas de problème.
Ensuite, tous les produits sont mis à jour 1 par 1, juste pour date_upd, dans la fonction cleanPositions (du fichier /classes/Product) :

    /**
     * Reorder product position in category $id_category.
     * Call it after deleting a product from a category.
     *
     * @param int $id_category
     */
    public static function cleanPositions($id_category, $position = 0)
    {
        $return = true;

        if (!(int) $position) {
            $result = Db::getInstance()->executeS('
                SELECT `id_product`
                FROM `' . _DB_PREFIX_ . 'category_product`
                WHERE `id_category` = ' . (int) $id_category . '
                ORDER BY `position`
            ');
            $total = count($result);

            for ($i = 0; $i < $total; ++$i) {
                $return &= Db::getInstance()->update(
                    'category_product',
                    array('position' => $i),
                    '`id_category` = ' . (int) $id_category . ' AND `id_product` = ' . (int) $result[$i]['id_product']
                );
                /*$return &= Db::getInstance()->execute(
                    'UPDATE `' . _DB_PREFIX_ . 'product` p' . Shop::addSqlAssociation('product', 'p') . '
                    SET p.`date_upd` = "' . date('Y-m-d H:i:s') . '", product_shop.`date_upd` = "' . date('Y-m-d H:i:s') . '"
                    WHERE p.`id_product` = ' . (int) $result[$i]['id_product']
                );*/
            }
        } else {
            $result = Db::getInstance()->executeS('
                SELECT `id_product`
                FROM `' . _DB_PREFIX_ . 'category_product`
                WHERE `id_category` = ' . (int) $id_category . ' AND `position` > ' . (int) $position . '
                ORDER BY `position`
            ');
            $total = count($result);
            $return &= Db::getInstance()->update(
                'category_product',
                array('position' => array('type' => 'sql', 'value' => '`position`-1')),
                '`id_category` = ' . (int) $id_category . ' AND `position` > ' . (int) $position
            );

            /*for ($i = 0; $i < $total; ++$i) {
                $return &= Db::getInstance()->execute(
                    'UPDATE `' . _DB_PREFIX_ . 'product` p' . Shop::addSqlAssociation('product', 'p') . '
                    SET p.`date_upd` = "' . date('Y-m-d H:i:s') . '", product_shop.`date_upd` = "' . date('Y-m-d H:i:s') . '"
                    WHERE p.`id_product` = ' . (int) $result[$i]['id_product']
                );
            }*/
        }

        return $return;
    }

 

C'est totalement insensé !!
En gros, pour une suppression d'un produit, qui est dans 4 catégories différentes, on va :
- mettre à jour 1 champ de 2 tables pour chaque produit de 4 catégories différentes.
Si j'ai 1000 produits par catégories, on va faire 4000 requêtes !!!

J'ai commenté ces lignes (à 2 endroits dans la fonction, et maintenant, il faut à peu près 1 seconde pour supprimer 1 produit.
Contre plusieurs minutes par produit précédemment.

 

Alors, est-ce que cette mise à jour de date est vraiment pertinente (le produit en lui-même n'est pas modifié en plus !!) et si c'est vraiment pertinent, il faut impérativement modifier la requête, pour qu'elle mette à jour tous les produits en 1 fois.

Moi, je suis pour la supprimer totalement, je ne vois pas l'intérêt de modifier la date de mise à jour d'un produit, qui n'a que changé de position !!

Difficile d'envoyer ça comme un bug... quoique !

Share this post


Link to post
Share on other sites

Bonjour,

ce qui est surtout insensé est de faire une requête de mise à jour par produit. On pourrait très bien remplir un tableau avec les ids des produits à mettre à jour et ensuite executer une seule requête pour mettre à jour la date avec une condition

WHERE p.id_product in ('.implode(',', $ids).')

 

Share this post


Link to post
Share on other sites

Oui @David-Julian Buch c'est à minima ce qu'il faut faire.

@Eolia : dommage, je n'ai pas trouvé votre suggestion, du coup, j'ai passé un peu de temps à trouver cette satanée requête !
J'ai commenté votre post ! Ca fera peut-être avancer le schmilblick !

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More