Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Оптимизация движка под 120 000 товаров


Recommended Posts

'active'   => in_array($category['category_id'], $parts)

тем самым закешировав активный пункт меню. я бы руководствовался этим

https://opencartforum.com/topic/3355-%D0%B5%D1%81%D1%82%D1%8C-%D0%BB%D0%B8-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0-%D0%BB%D0%BE%D0%B3-%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2/page__p__22909#entry22909

Надіслати
Поділитися на інших сайтах

тем самым закешировав активный пункт меню

Из двух зол. как говорится раз.

А два, никто не мешает сделать кеш под все категории верхнего уровня!

Либо же вывести активную категорию в тплку, и одной строкойскрипта на Jquery применить стиль!

Или перешерстить массив из кеша и всунуть ему актив в контроллере.. Вобщем, мальчик, включи фантазию и действуй, если надо!

Надіслати
Поділитися на інших сайтах


Где то так, опять же если на скорую руку!

$data=array('menu');
 $menu = $this->cache->get('menu.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id'));
 $this->data['categories']= $menu;
 if (!$menu) {
 $categories = $this->model_catalog_category->getCategories(0);
 foreach ($categories as $category) {
  if ($category['top']) {
	$children_data = array();

	$children = $this->model_catalog_category->getCategories($category['category_id']);

	foreach ($children as $child) {
	 $data = array(
	  'filter_category_id'  => $child['category_id'],
	  'filter_sub_category' => true
	 );

	 if ($this->config->get('config_product_count')) {
	  //$product_total = $this->model_catalog_product->getTotalProducts($data);
	  $product_total='';
	  $child['name'] .= ' (' . $product_total . ')';
	 }

	 $children_data[] = array(
	  'name'  => $child['name'],
	  'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])
	 );	
	}

	// Level 1
	$this->data['categories'][] = array(
	 'name'  => $category['name'],
	 'children' => $children_data,
	 'column'   => $category['column'] ? $category['column'] : 1,
	 'href'  => $this->url->link('product/category', 'path=' . $category['category_id']),
  //   'active'   => in_array($category['category_id'], $parts)
	);
  }
 }
 $menu = $this->data['categories'];
 $this->cache->set('menu.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') , $menu);

 }

if (isset($parts)) {

  $this->data['categories']= array();

foreach ($menu as $category) {

   $this->data['categories'][] = array(
	 'name'  => $category['name'],
	 'children' =>  $category['children'],
	 'column'   => $category['column'] ,
	 'href'  =>  $category['href'] ,
	 'active'   => in_array($category['category_id'], $parts)
	);



}

 }

UPD Благодаря тошноте некоторых, получается как то так!

Надіслати
Поділитися на інших сайтах


эх, молоточек, не доучился ты на программиста, а советовать так и прёт )))

в решении Yesvik'а 1 запрос к базе. у тебя же по запросу на каждую главную категорию. да и не понятно к чему

} elseif (isset($parts)) { 

выходит кеш будет работать только на страницах отличных от категорий.

  • +1 1
Надіслати
Поділитися на інших сайтах

Тихо промолчу... А то кисо обидетсо!

Слава богу на форуме не всем моск пхп заменило!

Тебя уже раз предупреждали, за твое поведение по моему?

Да и людей я не швыряю в отличии от некоторых ?

А потом с боями бабло не возвращаю!

Прекрати малышь, хамить!

эх, молоточек, не доучился ты на программиста, а советовать так и прёт )))

Зато у меня магазины свои работают и я могу здесь тусить фо фан... И не бегать по личкам с предложениями по 500 рублей.

А также не слушать отзывы "благодарных покупателей" недофильтра.

И где это ты вдруг взял что я собирался учится на программиста, превращаться в тебеподобного зануду, нет никакого желания!

И вместо своих чудовысеров. я тебе уже писал миллион раз! пиши альтернативу и правки!!!!

А то пользы от этих вау фау, столько же, сколько от брызг от кучи... сам знаешь чего!

UPD вспомнилась кстати история, меня б тут не было ваще, если бы чудо фрилансер сдал вовремя свои поделки года полтора назад моему товарищу, и не пришлось вместо него копать все самому.

  • +1 5
Надіслати
Поділитися на інших сайтах


да всё норм, успокойся, пиши свой чудо код, я в школе детям показывать буду как не надо делать.

на досуге открой раздел дополнения и посчитай сколько раз мой ник там повторяется.

в сообществе open sourse есть очень хорошее правило ИМХО. право голоса имеет лишь тот, кто сам чего-то достиг.

иначе от недоучек не отобьешься )))

а по теме дайте знать когда придумаете что-то быстрее алгоритма Yesvik'а

  • +1 2
Надіслати
Поділитися на інших сайтах

Я статейку напишу более обстоятельную. А то так много полезной инфы уходит в никуда.

Как продвигается? Куда смотреть, чтобы не упустить ее из виду? :-)

Надіслати
Поділитися на інших сайтах

  • 2 weeks later...

Фрилансер я хоть и новичек на форуме, но вот что заметил, нафиг ты троллишь? Люди пытаются пользу обществу принести, ты нормально обьясняй что не так делается. Не можешь обьяснить тогда не вмешивайся и не троль. Смысл твоих сообщений? Вот хорошая тема загнулась , а глядишь и что то хорошее бы вышло...

  • +1 3
Надіслати
Поділитися на інших сайтах


3я проблема решается кешируемым seo модулем, зачем резать поле если можно задать длину индекса? http://dev.mysql.com...eate-index.html

SQL_CALC_FOUND_ROWS справедливо, но дальше по тексту не нашел SELECT FOUND_ROWS();

хотя может кому-то будет полезно.

Надіслати
Поділитися на інших сайтах

Обещанная статейка.

Если хотите обсуждать ее, давайте по теме - SQL.

Я понимаю, что кэширование, VPS и все такое никто не отменял, но ДО них есть не самые быстрые SQL-запросы.

Очень круто, особенно с выложенным кодом измененных файлов! Но их всего 4 получилось? А как же контроллер акций? Или вы решили вырезать функциональность акционных цен, но тогда почему на гитхабе сохранились запросы из полей product_special? И я так понимаю, вы не делали денормализацию бд, а просто упомянули о том, что она тоже может помочь?

Надіслати
Поділитися на інших сайтах

денормализация базы влечет за собой потерю совместимости, помимо существующих скриптов придется переписывать все новые модули которые работают с этими таблицами перед установкой.

Надіслати
Поділитися на інших сайтах

кстати, я бы FOUND_ROWS возвращал сразу с результатом, а не записывал в поле потому как конекшн один, все запросы идут через него, т.е. SELECT FOUND_ROWS будет гарантированно возвращать результат последнего запроса, а вот model_catalog_product->getFoundProducts() уже не факт

Надіслати
Поділитися на інших сайтах

Обещанная статейка.

Если хотите обсуждать ее, давайте по теме - SQL.

Я понимаю, что кэширование, VPS и все такое никто не отменял, но ДО них есть не самые быстрые SQL-запросы.

В Magento ребята лихо сделали. Там используется в качестве основы Entity-Attribute-Value модель организации данных, которая сам по себе очень тормозная. Но там есть функция, запуская которую по имеющимся данным строишь простую плоскую таблицу со всеми параметрами товаров. Таблицы создаются под каждый "Magento магазин" то есть даже для каждого языкового варианта данных. В результате вся работ во фронт офисе движка строится на основе всего двух плоских таблиц (товаров и категорий) и ни каких JOIN. Вот почему Magento может летать при большой номенклатуре на хостингах стоимостью 3.5 euro в месяц (140 рублей по нашему), причем даже при приличной посетительской активности (по несколько сотен человек в день).

Единственный недостаток такого подхода, количество полей и их размеры должны быть такими, чтобы одна запись в плоской таблице не вываливалась за 1 блок оперативной памяти, то есть за 65К.

Надіслати
Поділитися на інших сайтах


Как я ни пытался применить изменения из статьи, подгоняя их под более старую версию ОС, не мог избавиться от ошибок из-за несоответствия 1.5.5.1 и 1.5.2.1, в итоге просто убрал rating из запроса (как я понимаю, в моей версии этого нет)

$query = $this->db->query("SELECT DISTINCT *, 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,
  (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)) . "')");

И наконец то загрузилась страница категории, но результаты меня как-то совсем не впечатлили (возможно я что-то упустил из виду, но изменений не много и они касаются всего 4 файлов, и единственные серьезные несоответствия есть только в контроллере product.php, но я их вроде бы все учел).

Холодный старт с очищенным кешем БЕЗ изменений из статьи:

Memory Usage: 8.073784 MB

Execution Time: 0.040718 seconds

121 sql queries executed:

Холодный старт с очищенным кешем С изменениями из статьи:

Memory Usage: 8.070534 MB

Execution Time: 0.152535 seconds

107 sql queries executed:

Горячий старт с кешем БЕЗ изменений из статьи:

Memory Usage: 8.026817 MB

Execution Time: 0.09645 seconds

77 sql queries executed:

Горячий старт с кешем С изменениями из статьи:

Memory Usage: 8.022881 MB

Execution Time: 0.251964 seconds

63 sql queries executed:

Все измерения проводились локально с тремя повторами для чистоты эксперимента, цифры приблизительно те же. В категории 4 000 товаров, на страницу вывод 15-ти, всего в магазине 16 000 товаров

Надіслати
Поділитися на інших сайтах

А не пытался сделать SQL_CALC_FOUND_ROWS ?

У 1.5.5.1 была выпилена функциональность с подсчетом кол-ва товаров для меню.

У меня - как в статье

есть и такой кусок с SQL_CALC_FOUND_ROWS

$sql = "SELECT SQL_CALC_FOUND_ROWS p.product_id, (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, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < '" . $this->NOW . "') AND (pd2.date_end = '0000-00-00' OR pd2.date_end > '" . $this->NOW . "')) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < '" . $this->NOW . "') AND (ps.date_end = '0000-00-00' OR ps.date_end > '" . $this->NOW . "')) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)";

А подсчет количества я сам выпилил давно уже, поэтому он не влияет

Надіслати
Поділитися на інших сайтах

Уважаемые гуру SQL, подскажите работет ли сортировка во вложенном запросе вида

SELECT my_field FROM  my_table1 WHERE my_field_id IN (SELECT my_field2_id FROM my_table2 ORDER BY sorting_field);

???

Надіслати
Поділитися на інших сайтах

Пробовал на демке из первого сообщения на 120к товарах.

Среднее время загрузки страниц категорий улучшилось из 0,100 сек до 0,065

Результат отличный, спасибо.

Надіслати
Поділитися на інших сайтах

Пробовал на демке из первого сообщения на 120к товарах.

Среднее время загрузки страниц категорий улучшилось из 0,100 сек до 0,065

Результат отличный, спасибо.

Блин, ребята, а что же у меня на 1.5.2.1 никаких приростов нет?

И еще подумал - не все ли равно, какое время загрузки страниц, если оно на порядок меньше времени загрузки всех картинок? Какая разница посетителю - 0.1 или 0.06 с, если картинки грузятся дольше

Надіслати
Поділитися на інших сайтах

И еще подумал - не все ли равно, какое время загрузки страниц, если оно на порядок меньше времени загрузки всех картинок? Какая разница посетителю - 0.1 или 0.06 с, если картинки грузятся дольше

Картинки кэшируются на стороне клиента, а на посещаемых сайтах картинки обычно выносят на другой сервер.

В большинстве случаев проблема медленной загрузки, как раз в скорости выполнения запросов.

+ неизвестно что будет с таким сайтом на 10к посетителей в сутки.

эта 0,1 секунда может превратится в 10, а с правками запросов уже будет 6 сек :ugeek:

Надіслати
Поділитися на інших сайтах

есть мнение, что поисковики индексируют быстрее сайты если у тех загрузка меньше

Есть такое, один раз меняли хостинг из-за того что индексация была корявая, хостинг тормозил переодически, после смены всё стало на ура.
Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.