Всем доброго времени суток.
Столкнулся с проблемой очень низкой производительности магазина, даже на мощном железе.
Судя по различным профайлам (как встроенным в престу, так и xdebug) существует несколько причин замедления, но все они связаны в той или иной степени с количеством аттрибутов и комбинаций товаров. В базе магазина достаточно много товаров с большим количеством свойств.
Теперь сами проблемы:
1. После перехода с 1.5.2 на 1.5.6 резко снизилась скорость загрузки страниц некоторых категорий товаров. С 2-3 сек до 25-30сек. 90% этого времени занимает выполнение следующего запроса к базе данных из /classes/Category.php стр. ~615 (метод getProducts()):
Код:
SELECT
p.*,
product_shop.*,
stock.out_of_stock,
IFNULL(stock.quantity, 0) AS quantity,
MAX(product_attribute_shop.id_product_attribute) id_product_attribute,
product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity,
pl.`description`,
pl.`description_short`,
pl.`available_now`,
pl.`available_later`,
pl.`link_rewrite`,
pl.`meta_description`,
pl.`meta_keywords`,
pl.`meta_title`,
pl.`name`,
MAX(image_shop.`id_image`) id_image,
il.`legend`,
m.`name` AS manufacturer_name,
cl.`name` AS category_default,
DATEDIFF(product_shop.`date_add`, DATE_SUB(NOW(),
INTERVAL 3
DAY)) > 0 AS new,
product_shop.price AS orderprice
FROM `mb_category_product` cp
LEFT JOIN `mb_product` p
ON p.`id_product` = cp.`id_product`
INNER JOIN mb_product_shop product_shop
ON (product_shop.id_product = p.id_product
AND product_shop.id_shop = 1)
LEFT JOIN `mb_product_attribute` pa
ON (p.`id_product` = pa.`id_product`)
LEFT JOIN mb_product_attribute_shop product_attribute_shop
ON (product_attribute_shop.id_product_attribute = pa.id_product_attribute
AND product_attribute_shop.id_shop = 1
AND product_attribute_shop.`default_on` = 1)
LEFT
JOIN mb_stock_available stock
ON (stock.id_product = p.id_product
AND stock.id_product_attribute = IFNULL(`product_attribute_shop`.id_product_attribute, 0)
AND stock.id_shop = 1)
LEFT JOIN `mb_category_lang` cl
ON (product_shop.`id_category_default` = cl.`id_category`
AND cl.`id_lang` = 1
AND cl.id_shop = 1)
LEFT JOIN `mb_product_lang` pl
ON (p.`id_product` = pl.`id_product`
AND pl.`id_lang` = 1
AND pl.id_shop = 1)
LEFT JOIN `mb_image` i
ON (i.`id_product` = p.`id_product`)
LEFT JOIN mb_image_shop image_shop
ON (image_shop.id_image = i.id_image
AND image_shop.id_shop = 1
AND image_shop.cover = 1)
LEFT JOIN `mb_image_lang` il
ON (image_shop.`id_image` = il.`id_image`
AND il.`id_lang` = 1)
LEFT JOIN `mb_manufacturer` m
ON m.`id_manufacturer` = p.`id_manufacturer`
WHERE product_shop.`id_shop` = 1
AND cp.`id_category` = 18
AND product_shop.`active` = 1
AND product_shop.`visibility` IN ("both", "catalog")
GROUP BY product_shop.id_product
ORDER BY `orderprice` ASC
LIMIT 0, 20
Если убрать соединение с таблицей stock то время выполнения запроса с 27 секунд падает до 0.8 сек. В магазине не используется контроль остатков. Временно поставил заплатку в запрос, категории стали открываться приемлимое время.
Вся загвоздка в том, что в старой версии престы (1.5.6.2), этот запрос вообще не выполнялся о_О Возможно есть некая волшебная настройка, которая приводит к выполнению данного запроса?