работа SS5 при большом количестве SKU основанных на характеристиках
у меня есть база в которой 48000 SKU так вот если у товара было 2 характеристики для выбора все работает, а как только у товара появлялась 3 характеристики то товар в корзину не клался. после анализа выяснилось что функция getSkuByFeatures создавала SQL запрос который должен был обработать 48000 в кубе записей.. после чего база данных требовала больше ресурсов :(
так вот я изменил эту функцию чтобы она не требовала много ресурсов
было :
стало
надеюсь такую оптимизацию проведут разработчики и мои изменения не затрутся при очередном обновлении.
так вот я изменил эту функцию чтобы она не требовала много ресурсов
было :
$sql = "SELECT t0.sku_id FROM ".$this->table." t0 ";
for ($i = 1; $i < count($features); $i++) {
$sql .= " JOIN ".$this->table." t".$i." ON t0.sku_id = t".$i.".sku_id";
}
$sql .= " WHERE t0.product_id = ".(int)$product_id." AND t0.sku_id IS NOT NULL";
$i = 0;
foreach ($features as $f => $v) {
$sql .= " AND t".$i.".feature_id = ".(int)$f." AND t".$i.".feature_value_id = ".$v;
$i++;
}
$sql .= " LIMIT 1";
return $this->query($sql)->fetchField();
стало
$sql = "SELECT t0.sku_id FROM (SELECT * FROM ".$this->table." WHERE `product_id`=".(int)$product_id.") t0 ";
for ($i = 1; $i < count($features); $i++) {
$sql .= " JOIN (SELECT * FROM ".$this->table." WHERE `product_id`=".(int)$product_id." ) t".$i." ON t0.sku_id = t".$i.".sku_id";
}
$sql .= " WHERE t0.sku_id IS NOT NULL";
$i = 0;
foreach ($features as $f => $v) {
$sql .= " AND t".$i.".feature_id = ".(int)$f." AND t".$i.".feature_value_id = ".$v;
$i++;
}
$sql .= " LIMIT 1";
return $this->query($sql)->fetchField();
надеюсь такую оптимизацию проведут разработчики и мои изменения не затрутся при очередном обновлении.
Эта тема в архиве. Добавление комментариев к ней отключено.
4 ответа
\wa-apps\shop\lib\model\shopProductFeatures.model.php
где еще поправить запросы, которые за фильтр отвечают? Потому что если ставить SQL_BIG_SELECTS. то весь сайт будет висеть, пока он обрабатывает этот запрос.
ALTER TABLE shop_product_features ADD INDEX `sku` (`sku_id`, `feature_id`, `feature_value_id`);