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

Помогите Opencart вешает сервер


aktine

Recommended Posts

Здравствуйте! Прошу помощи, уже несколько недель opencart 1.5.5.1 вешает мощный сервер. Включил на сервере лог медленных запросов и примерно понял в чем причина, но не знаю как исправить.

Сайт дорабатывался,  из последнего, делали сортировку в категории с товарами такую:  сначала отображаются товары в наличии, потом товары, которых нет в наличии. 

 

Подозреваю что проблема либо в кривом коде, либо в большом количестве товара, с которыми не справляется сортировка и вешает mysql (около 4000 позиций)  , и скорее всего проблемы идут из этого файла /catalog/model/catalog/product.php

 

Сервер вешается как только начинает расти посещаемость.

 

Помогите как исправить. 

 

Лог медленных запросов mysql выдает следущее:

 

SELECT p.product_id, (SELECT AVG(rating) AS total FROM oc_review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT COUNT(*) AS total FROM oc_order_product op LEFT JOIN `oc_order` o ON (op.order_id = o.order_id) WHERE o.order_status_id > '0' AND op.product_id = p.product_id GROUP BY op.product_id) as topsellers FROM oc_product p LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' GROUP BY p.product_id ORDER BY p.date_added DESC LIMIT 16;
# User@Host: admin_db[admin_db] @ localhost []
# Thread_id: 824  Schema: admin_db  QC_hit: No
# Query_time: 350.420148  Lock_time: 22.021837  Rows_sent: 16  Rows_examined: 31703240
SET timestamp=1456237211;
SELECT p.product_id, (SELECT AVG(rating) AS total FROM oc_review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT COUNT(*) AS total FROM oc_order_product op LEFT JOIN `oc_order` o ON (op.order_id = o.order_id) WHERE o.order_status_id > '0' AND op.product_id = p.product_id GROUP BY op.product_id) as topsellers FROM oc_product p LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' GROUP BY p.product_id ORDER BY p.date_added DESC LIMIT 16;
# User@Host: admin_db[admin_db] @ localhost []
# Thread_id: 821  Schema: admin_db  QC_hit: No
# Query_time: 353.184947  Lock_time: 24.337040  Rows_sent: 16  Rows_examined: 31703240
SET timestamp=1456237211;
SELECT p.product_id, (SELECT AVG(rating) AS total FROM oc_review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT COUNT(*) AS total FROM oc_order_product op LEFT JOIN `oc_order` o ON (op.order_id = o.order_id) WHERE o.order_status_id > '0' AND op.product_id = p.product_id GROUP BY op.product_id) as topsellers FROM oc_product p LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' GROUP BY p.product_id ORDER BY p.date_added DESC LIMIT 16;
# User@Host: admin_db[admin_db] @ localhost []
# Thread_id: 809  Schema: admin_db  QC_hit: No
# Query_time: 362.182525  Lock_time: 33.299391  Rows_sent: 16  Rows_examined: 31703240
SET timestamp=1456237211;
SELECT p.product_id, (SELECT AVG(rating) AS total FROM oc_review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT COUNT(*) AS total FROM oc_order_product op LEFT JOIN `oc_order` o ON (op.order_id = o.order_id) WHERE o.order_status_id > '0' AND op.product_id = p.product_id GROUP BY op.product_id) as topsellers FROM oc_product p LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' GROUP BY p.product_id ORDER BY p.date_added DESC LIMIT 16;
# User@Host: admin_db[admin_db] @ localhost []
# Thread_id: 822  Schema: admin_db  QC_hit: No
# Query_time: 353.151940  Lock_time: 24.169539  Rows_sent: 16  Rows_examined: 31703240
Надіслати
Поділитися на інших сайтах


Сделал, вот что получилось:

 

1 PRIMARY p2s index PRIMARY,store_id PRIMARY 8 NULL 3873 Using where; Using index; Using temporary; Using f... 1 PRIMARY pd eq_ref PRIMARY,language_id PRIMARY 8 admin_db.p2s.product_id,const 1 Using index 1 PRIMARY p eq_ref PRIMARY PRIMARY 4 admin_db.p2s.product_id 1 Using where 4 DEPENDENT SUBQUERY o ALL PRIMARY NULL NULL NULL 3444 Using where; Using temporary; Using filesort 4 DEPENDENT SUBQUERY op ref order_id,order_id_order_product_id order_id 4 admin_db.o.order_id 1 Using where 3 DEPENDENT SUBQUERY ps ref product_id product_id 4 func 1 Using where; Using filesort 2 DEPENDENT SUBQUERY r1 ref product_id product_id 4 func 1 Using where

Змінено користувачем aktine
Надіслати
Поділитися на інших сайтах


На странице категорий со списком товаров есть самописный фильтр. Может быть это он виноват?

 


<div class="product-new-filter">
<div class="product-new-filter-price">
<div class="product-new-filter-price-1">Цена, руб.</div>
<div class="product-new-filter-price-price-min"><input type="text" name="price_min" placeholder="от" value="<?php if (isset($this->request->get['min'])) echo $this->request->get['min']; ?>" /></div>
<div class="product-new-filter-price-price-max"><input type="text" name="price_max" placeholder="до" value="<?php if (isset($this->request->get['max'])) echo $this->request->get['max']; ?>" /></div>
<div class="product-new-filter-price-nalich"><input type="checkbox" id="product_nalich" name="product_nalich" value="1" <?php if (isset($this->request->get['checked'])&&$this->request->get['checked']==1) echo 'checked="checked"'; ?>"/><label for="product_nalich">В наличии</label></div>
</div>
<div class="product-new-filter-button">Применить</div>
  </div>
  <?php } ?>
  <?php if ($products) { ?>
  <div class="product-filter">
    <div class="display"><?php echo $text_display; ?></div>
<div class="product-compare"><a href="<?php echo $compare; ?>" id="compare-total"><?php echo $text_compare; ?></a></div>
    <div class="limit"><b><?php echo $text_limit; ?></b>
      <select onchange="location = this.value;">
        <?php foreach ($limits as $limits) { ?>
        <?php if ($limits['value'] == $limit) { ?>
        <option value="<?php echo $limits['href']; ?>" selected="selected"><?php echo $limits['text']; ?></option>
        <?php } else { ?>
        <option value="<?php echo $limits['href']; ?>"><?php echo $limits['text']; ?></option>
        <?php } ?>
        <?php } ?>
      </select>
    </div>
    <div class="sort"><b><?php echo $text_sort; ?></b>
      <select onchange="location = this.value;">
        <?php foreach ($sorts as $sorts) { ?>
        <?php if ($sorts['value'] == $sort . '-' . $order) { ?>
        <option value="<?php echo $sorts['href']; ?>" selected="selected"><?php echo $sorts['text']; ?></option>
        <?php } else { ?>
        <option value="<?php echo $sorts['href']; ?>"><?php echo $sorts['text']; ?></option>
        <?php } ?>
        <?php } ?>
      </select>
    </div>
  </div>


 
 

Змінено користувачем aktine
Надіслати
Поділитися на інших сайтах


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

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

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

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

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

Вхід

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

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

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