Итак, снова перемерял с изменениями из статьи toporchillo, получилось намного интереснее: До изменений Cache off: 7.22501 s 7.95 mb logs (2) sql (114) files (95) request (95) Cache on: 3.48739 s 7.95 mb logs (2) sql (73) files (95) request (95) После изменений Cache off: 3.62278 s 7.98 mb logs (2) sql (103) files (95) request (95) Cache on: 1.65011 s 7.98 mb logs (2) sql (62) files (95) request (95) То есть выигрыш по скорости в 2 раза, что очень круто! И я так думаю, что было бы еще лучше, если бы у меня была не 1.5.2.1, а 1.5.5.1, потому что есть пара моментов с несовместимостью. Буду благодарен, если кто-то укажет на причины ошибок: 1) Notice: Error: Unknown column 'p.rating' in 'field list' Возникает из-за того, что в самом первом оптимизированном запросе
$query = $this->db->query("SELECT DISTINCT *, p.rating, pd.name AS name, p.image, m.name AS manufacturer,
(SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int)$customer_group_id . "') AS reward,
(SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "') AS stock_status,
(SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS weight_class,
(SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS length_class,
p.rating, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews,
p.sort_order
FROM " . DB_PREFIX . "product p
LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id)
LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id)
WHERE p.product_id IN ('" . implode("','", array_keys($product_data)) . "')");нет столбца rating (кмк, проблема в 1.5.2.1), как я это обошел - заменил в запросе в 2-х местах p.rating на (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS ratingв итоге длина запроса увеличилась, но рейтинг стал учитываться (если можно проще это сделать, укажите плиз). 2) Undefined index: discount in Z:\home\localhost\ocstore\catalog\model\catalog\product.php в 51-й строке: $row['price'] = ($row['discount'] ? $row['discount'] : $row['price']);я это просто закомментил, так как в магазине discounts вообще не используются. 3) И внезапно Notice: Undefined index: special in Z:\home\localhost\mstore\catalog\controller\product\category.php в 196-й и 203-й строках if ((float)$result['special']) {
$special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax')));
} else {
$special = false;
}
if ($this->config->get('config_tax')) {
$tax = $this->currency->format((float)$result['special'] ? $result['special'] : $result['price']);
} else {
$tax = false;
}Здесь я вообще не понял что случилось и ничего не смог придумать, потому что акционная цена special все равно показывается