Обратил внимание, что если в инстант шопе попробовать удалить сразу много категорий, в которых очень много товаров, то система виснет напрочь. Выяснил, что происходит это из-за того что после каждого удаления товара происходит пересортировка:
Я решил переделать эти функции с таким алгоритмом: сначала удаляем все товары из категории без пересортировки, и уже в конце делаем эту пересортировку. И вы знаете, щас удаление происходит ОЧЕНЬ быстро!
Было бы интересно услышать мнение гуру по этому поводу, а также можно ли еще как-то оптимизировать процесс удаления множества категорий?
public function deleteItem($id){ ... ... $this->reorder('cms_shop_items_cats', 'category_id', 'item_id');
Я решил переделать эти функции с таким алгоритмом: сначала удаляем все товары из категории без пересортировки, и уже в конце делаем эту пересортировку. И вы знаете, щас удаление происходит ОЧЕНЬ быстро!
/* ========================================================================== */ /* ========================================================================== */ public function deleteItems($items) { foreach($items as $item_id){ $sql = "SELECT category_id, item_id FROM cms_shop_items_cats WHERE item_id={$item_id} GROUP BY category_id"; //получаем все категории где встречается товар $res = $this->inDB->query($sql); while($r = $this->inDB->fetch_assoc($res)){ $list_categories[$r['category_id']] = $r['category_id']; } $this->deleteItem($item_id, false); //удааляем товар БЕЗ упорядочивания (для скорости) } foreach($list_categories as $key=>$category_id) { $this->reorderShopCategory($category_id); } return true; }
/* ========================================================================== */ /* ========================================================================== */ public function deleteItem($id, $reorder=true){ //$reorder - говорит о том, надо ли потом делать упорядочивание $imageurl = 'shop'.$id.'.jpg'; //удаляем дополнительные изображения $files = $this->getItemImages($id); $this->dropItemImages($files); $this->inDB->query("DELETE FROM cms_shop_items WHERE id={$id}"); $this->inDB->query("DELETE FROM cms_shop_items_bind WHERE item_id={$id}"); $this->inDB->query("DELETE FROM cms_shop_chars_val WHERE item_id={$id}"); $this->inDB->query("DELETE FROM cms_shop_chars_val WHERE item_id={$id}"); $this->inDB->query("DELETE FROM cms_tags WHERE target='shop' AND item_id = {$id}"); $this->inDB->query("DELETE FROM cms_comments WHERE target = 'shop' AND target_id = {$id}"); $this->inDB->query("DELETE FROM cms_ratings WHERE target = 'shop' AND item_id = {$id}"); if($reorder) { $this->reorderShopItems($id); } else { $this->inDB->query("DELETE FROM cms_shop_items_cats WHERE item_id={$id}"); //эта функция вызывается в reorderShopItems, если она вызывается } }
/* ==================================================================================================== */ /* ==================================================================================================== */ public function reorderShopItems($item_id) { if(!$item_id) return false; $sql = "SELECT category_id, item_id FROM cms_shop_items_cats WHERE item_id={$item_id} GROUP BY category_id"; //получаем все категории где встречается товар $res = $this->inDB->query($sql); $this->inDB->query("DELETE FROM cms_shop_items_cats WHERE item_id={$item_id}"); while($r = $this->inDB->fetch_assoc($res)){ $ord = 1; $sql2 = "SELECT item_id FROM cms_shop_items_cats WHERE category_id = {$r['category_id']} ORDER BY ordering"; $res2 = $this->inDB->query($sql2); while($r2 = $this->inDB->fetch_assoc($res2)){ $this->inDB->query("UPDATE cms_shop_items_cats SET ordering = {$ord} WHERE item_id={$r2['item_id']} AND category_id={$r['category_id']}"); $ord++; } } return true; }
Было бы интересно услышать мнение гуру по этому поводу, а также можно ли еще как-то оптимизировать процесс удаления множества категорий?
Реклама #
abasia 12 лет назад #