Virtuemart 2: Оптимизация Category
- Joomla /
- Virtuemart
- 16.10.2013
- job
- 6352
На данный момент в разработке интернет-магазин Virtuemart2 с интеграцией 1С. Решил посмотреть на запросы виртмала и ужаснулся. Грандиозная утечка в БД. Как можно ради того что бы узнать Media изображение категории дополнительно обращаться к базе данных? Я в шоке. Это же все делается в том же запросе категорий. Капец, до сих пор успокоиться не могу.
Логики разработчиков если честно не прослеживаю. Может конечно это функционал на будущее развитие проекта, но мне все равно не понятно для чего это. В общем в магазине порядком 150 категорий и что бы вытянуть для них картинки движок дополнительно делает 150 запросов к БД. ЗАЧЕМ? В общем поплевав в монитор решил убить (оптимизировать) это чудо.
Открываем administrator/components/com_virtuemart/models/category.php ищем функцию getChildCategoryList примерно 120 строка
$query запрос
$query = 'SELECT L.* FROM `#__virtuemart_categories_'.VMLANG.'` as L JOIN `#__virtuemart_categories` as C using (`virtuemart_category_id`)'; $query .= ' LEFT JOIN `#__virtuemart_category_categories` as CC on C.`virtuemart_category_id` = CC.`category_child_id`'; $query .= 'WHERE CC.`category_parent_id` = ' . (int)$virtuemart_category_id . ' '; $query .= 'AND C.`virtuemart_vendor_id` = ' . (int)$vendorId . ' '; $query .= 'AND C.`published` = 1 '; $query .= ' ORDER BY C.`ordering`, L.`'.$selectedOrdering.'` '.$orderDir;
меняем на
$query = 'SELECT L.*, M.virtuemart_media_id as virtuemart_media_id FROM `#__virtuemart_categories_'.VMLANG.'` as L JOIN `#__virtuemart_categories` as C using (`virtuemart_category_id`)'; $query .= ' LEFT JOIN `#__virtuemart_category_categories` as CC on C.`virtuemart_category_id` = CC.`category_child_id`'; $query .= ' LEFT JOIN `#__virtuemart_category_medias` as M on M.`virtuemart_category_id` = C.`virtuemart_category_id`'; $query .= 'WHERE CC.`category_parent_id` = ' . (int)$virtuemart_category_id . ' '; $query .= 'AND C.`virtuemart_vendor_id` = ' . (int)$vendorId . ' '; $query .= 'AND C.`published` = 1 '; $query .= ' ORDER BY C.`ordering`, L.`'.$selectedOrdering.'` '.$orderDir;
и удаляем конструкцию foreach для перебора массива
if(!empty($childList)){ if(!class_exists('TableCategory_medias'))require(JPATH_VM_ADMINISTRATOR.DS.'tables'.DS.'category_medias.php'); foreach($childList as $child){ $xrefTable = new TableCategory_medias($db); //$xrefTable = $this->getTable('category_medias'); $child->virtuemart_media_id = $xrefTable->load($child->virtuemart_category_id); } }
Ну вот как то так уменьшил количество запросов к базе данных вдвое!
-
SergeiBus
-
-
-
-
-
-