Я использую Prestashop Related Product PRO plugin, который действительно полезен, когда дело доходит до некоторых случайных продуктов из той же категории, но использует метод Prestashop ORDER BY RAND
по умолчанию и когда я включаю этот метод, чтобы показать 24 случайные продукты, время загрузки которых не используется, от 4000мс до 7000 мс, потому что он ждет, когда база данных покажет некоторые случайные продукты.Prestashop product ORDER BY RAND оптимизация
Когда я уменьшаю его до 8 продуктов, это 1500-2000 мс, но он все еще слишком длинный, когда дело доходит до оценки SEO. Я искал решение в подключении, но я не мог понять, но я нашел это:
Presta 1.6.1.4 здесь. В классах \ category.php что-то о линии 744 мы имеем что-то вроде этого:
$sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) AS quantity'.(Combination::isFeatureActive() ? ', IFNULL(product_attribute_shop.id_product_attribute, 0) AS 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`, image_shop.`id_image` id_image,
il.`legend` as legend, m.`name` AS manufacturer_name, cl.`name` AS category_default,
DATEDIFF(product_shop.`date_add`, DATE_SUB("'.date('Y-m-d').' 00:00:00",
INTERVAL '.(int)$nb_days_new_product.' DAY)) > 0 AS new, product_shop.price AS orderprice
FROM `'._DB_PREFIX_.'category_product` cp
LEFT JOIN `'._DB_PREFIX_.'product` p
ON p.`id_product` = cp.`id_product`
'.Shop::addSqlAssociation('product', 'p').
(Combination::isFeatureActive() ? ' LEFT JOIN `'._DB_PREFIX_.'product_attribute_shop` product_attribute_shop
ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop='.(int)$context->shop->id.')':'').'
'.Product::sqlStock('p', 0).'
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl
ON (product_shop.`id_category_default` = cl.`id_category`
AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').')
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
ON (p.`id_product` = pl.`id_product`
AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').')
LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop
ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$context->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'image_lang` il
ON (image_shop.`id_image` = il.`id_image`
AND il.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'manufacturer` m
ON m.`id_manufacturer` = p.`id_manufacturer`
WHERE product_shop.`id_shop` = '.(int)$context->shop->id.'
AND cp.`id_category` = '.(int)$this->id
.($active ? ' AND product_shop.`active` = 1' : '')
.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '')
.($id_supplier ? ' AND p.id_supplier = '.(int)$id_supplier : '');
if ($random === true) {
$sql .= ' ORDER BY RAND() LIMIT '.(int)$random_number_products;
} else {
$sql .= ' ORDER BY '.(!empty($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.bqSQL($order_by).'` '.pSQL($order_way).'
LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
}
И если я не ошибаюсь, это ответственность за хвастаясь продукцию на страницах категорий (включая некоторые плагины, а). Действительно плохой порядок от rand(). Как Вы можете видеть, что есть линия
if ($random === true) {
$sql .= ' ORDER BY RAND() LIMIT '.(int)$random_number_products;
}
и, по моему мнению, это является ключевым, когда мы можем начать некоторые изменения. Я нашел статью об оптимизации MySQL ORDER BY RAND
запросов с некоторыми действительно удовлетворяющими результатами. Вы можете прочитать их здесь
https://www.warpconduit.net/2011/03/23/selecting-a-random-record-using-mysql-benchmark-results/
и здесь
http://jan.kneschke.de/projects/mysql/order-by-rand/ (в этом случае результаты были просто изумительны)
Но есть случай. Мои навыки программирования ограничены для реализации этих методов в Prestashop: (Это просто сложно для меня, поэтому кто-то может помочь мне с редактированием этих строк одним из новых методов. Может ли кто-нибудь, у кого есть лучший опыт и знания, помочь мне? Или придумать что-нибудь, что лучше тогда те, которые я предложил?
Вы правы. 'ORDER BY RAND()' - это печально известный антипаттерн. Представленные вами решения являются приемлемыми. особенно Ян Кнешке. Чтобы реализовать их, вам понадобится некоторый способ узнать или приблизиться к количеству строк, которые появятся в вашем результирующем наборе, если вы остановите все операции «LIMIT». Завышенность приемлема, но чем больше переоценка, тем хуже будет ваша производительность запросов. –
Ключ в том, что я попытался реализовать его методы, и я потерпел неудачу. Я просто не могу сделать это в Престашопе. –
Какова ваша оценка неограниченной длины набора результатов? –