Jump to content

Recommended Posts

Здравствуйте. Помогите пожалуйста, кто может, Долго грузятся прайсы с товарами, больше 12 000 шт., при загрузке большого кол-ва выкидывает с админки с ошибкой 504 Gateway Time-out.

Обнаружила медленные запросы, больше недели с одного IP ежедневно по 6-8 шт., время 6-9 секунд.

Один из:

SELECT (IF (LCASE(pd.name) LIKE '%goodyear ultra grip ice 2%'600) + IF (LCASE(pd.name) LIKE'goodyear%'800) + IF (LCASE(pd.name) LIKE '%goodyear%'80) + IF (LCASE(pd.name) LIKE 'ultra%'800) + IF (LCASE(pd.name) LIKE '%ultra%'80) + IF (LCASE(pd.name) LIKE 'grip%'800) + IF (LCASE(pd.name) LIKE'%grip%'80) + IF (LCASE(pd.name) LIKE 'ice%'800) + IF (LCASE(pd.name) LIKE '%ice%'80) + IF(LCASE(pd.name) LIKE '2%'800) + IF (LCASE(pd.name) LIKE '%2%'80) + IF (LCASE(pd.description) LIKE'%goodyear ultra grip ice 2%'200) + IF (LCASE(pd.description) LIKE '%goodyear%'20) + IF(LCASE(pd.description) LIKE '%ultra%'20) + IF (LCASE(pd.description) LIKE '%grip%'20) + IF(LCASE(pd.description) LIKE '%ice%'20) + IF (LCASE(pd.description) LIKE '%2%'20) + IF (LCASE(pd.tag)LIKE '%goodyear%'90) + IF (LCASE(pd.tag) LIKE '%ultra%'90) + IF (LCASE(pd.tag) LIKE '%grip%'90) + IF(LCASE(pd.tag) LIKE '%ice%'90) + IF (LCASE(pd.tag) LIKE '%2%'90)) AS relevance, p.product_id FROMoc_product p LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOINoc_product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN oc_product_attribute pa ON(p.product_id = pa.product_id) WHERE pd.language_id = '1' AND p.STATUS = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND ( (LCASE(pd.name) LIKE '%goodyear%') OR (LCASE(pd.name) LIKE'%ultra%') OR (LCASE(pd.name) LIKE '%grip%') OR (LCASE(pd.name) LIKE '%ice%') OR (LCASE(pd.name) LIKE'%2%') OR (LCASE(pd.description) LIKE '%goodyear%') OR (LCASE(pd.description) LIKE '%ultra%') OR(LCASE(pd.description) LIKE '%grip%') OR (LCASE(pd.description) LIKE '%ice%') OR (LCASE(pd.description)LIKE '%2%') OR (LCASE(pd.tag) LIKE '%goodyear%') OR (LCASE(pd.tag) LIKE '%ultra%') OR (LCASE(pd.tag) LIKE'%grip%') OR (LCASE(pd.tag) LIKE '%ice%') OR (LCASE(pd.tag) LIKE '%2%') OR (LCASE(pa.text) LIKE'%goodyear%' AND pa.language_id = '1' ) OR (LCASE(pa.text) LIKE '%ultra%' AND pa.language_id = '1' ) OR(LCASE(pa.text) LIKE '%grip%' AND pa.language_id = '1' ) OR (LCASE(pa.text) LIKE '%ice%' AND pa.language_id = '1' ) OR (LCASE(pa.text) LIKE '%2%' AND pa.language_id = '1' ) OR (LCASE(p.model) LIKE '%goodyear%') OR(LCASE(p.model) LIKE '%ultra%') OR (LCASE(p.model) LIKE '%grip%') OR (LCASE(p.model) LIKE '%ice%') OR(LCASE(p.model) LIKE '%2%') OR (LCASE(p.sku) = 'goodyear') OR (LCASE(p.sku) = 'ultra') OR (LCASE(p.sku) = 'grip') OR (LCASE(p.sku) = 'ice') OR (LCASE(p.sku) = '2') OR (LCASE(p.upc) = 'goodyear') OR (LCASE(p.upc) = 'ultra') OR (LCASE(p.upc) = 'grip') OR (LCASE(p.upc) = 'ice') OR (LCASE(p.upc) = '2') OR (LCASE(p.ean) = 'goodyear') OR (LCASE(p.ean) = 'ultra') OR (LCASE(p.ean) = 'grip') OR (LCASE(p.ean) = 'ice') OR (LCASE(p.ean)'2') OR (LCASE(p.jan) = 'goodyear') OR (LCASE(p.jan) = 'ultra') OR (LCASE(p.jan) = 'grip') OR (LCASE(p.jan) = 'ice') OR (LCASE(p.jan) = '2') OR (LCASE(p.isbn) = 'goodyear') OR (LCASE(p.isbn) = 'ultra') OR (LCASE(p.isbn) = 'grip') OR (LCASE(p.isbn) = 'ice') OR (LCASE(p.isbn) = '2') OR (LCASE(p.mpn) = 'goodyear') OR (LCASE(p.mpn) = 'ultra') OR (LCASE(p.mpn) = 'grip') OR (LCASE(p.mpn) = 'ice') OR (LCASE(p.mpn) = '2') ) GROUP BY p.product_id ORDER BY relevance DESCLCASE(pd.name) ASC LIMIT 0,30

id select_type table partitions type possible_keys key key_len ref rows filtered Extra  
1 SIMPLE p NULL ALL PRIMARY NULL NULL NULL 10089 3.33 Using where; Using temporary; Using filesort
1 SIMPLE p2s NULL eq_ref PRIMARY,store_id PRIMARY 8 diacar_db.p.product_id,const 1 100.00 Using index
1 SIMPLE pd NULL eq_ref PRIMARY,language_id PRIMARY 8 diacar_db.p.product_id,const 1 100.00 NULL
1 SIMPLE pa NULL ref PRIMARY PRIMARY 4 diacar_db.p.product_id 749 100.00 Using where
 

 

Вроде как, у некоторых таблиц не используются индексы и грубо сканирование идет. ПОМОГИТЕ установить правильно индексы или другие возможные варианты.

 

 

Что проделано:

Заказано на хостинке Memcache - не помогло.

Отключено Подсчет кол-ва товаров;

Отключено filterpro - не помогло.

 

 

Share this post


Link to post
Share on other sites

Запросы такого плана LIKE '%goodyear%',  не делают выборку по индексам а шерстят всю таблицу перебором (вам это explain и показал)

 
Спойлер

 

1 SIMPLE p NULL ALL PRIMARY NULL NULL NULL 10089 3.33 Using where; Using temporary; Using filesort

 

 

 


Так что вам индексы здесь не помогут

Нужна полная оптимизация плюс установка Сфинкса

Готовьте бюджет ~ 9900 рублей (мин)

Share this post


Link to post
Share on other sites

да, запросы по вхождению вида "%слово%" работают очень медленно, так как в этом случае не используются индексы, особенно если поиск происходит по фразе из нескольких слов, особенно если у вас магазин на 12000 товаров. 
У меня есть модуль поиск специально для больших сайтов, он специально написан чтобы решить эту проблему, если будут вопросы - пишите в ЛС отвечу

 

Share this post


Link to post
Share on other sites
15 минут назад, markimax сказал:

 


Так что вам индексы здесь не помогут

Нужна полная оптимизация плюс установка Сфинкса

Готовьте бюджет ~ 9900 рублей (мин)

 

Cпасибо. Сама попробую, если нет - тогда....А то, что с одного ай пи идут запросы, не критично?

Share this post


Link to post
Share on other sites
2 минуты назад, Mila80 сказал:

 

Cпасибо. Сама попробую, если нет - тогда....А то, что с одного ай пи идут запросы, не критично?

 

Кто ищет что то или кто то (конкуренты) сознательно ДдоСит узкое место вашего магазина чтобы его положить

Share this post


Link to post
Share on other sites
2 minutes ago, Mila80 said:

 

Cпасибо. Сама попробую, если нет - тогда....А то, что с одного ай пи идут запросы, не критично?

6-8 в день это не много, если бы сотни тогда можно было бы подозревать какой-то парсинг или сбор информации конкурентами или еще что. 
а 6-8 в день спокойно может дать какой-то посетитель для поиска нужного товара. 

Share this post


Link to post
Share on other sites
10 минут назад, sv2109 сказал:

6-8 в день это не много, если бы сотни тогда можно было бы подозревать какой-то парсинг или сбор информации конкурентами или еще что. 
а 6-8 в день спокойно может дать какой-то посетитель для поиска нужного товара. 

Да, 6-8 запросов, по 2 одинаковым товарам, ежедневно с одного ай пи. Удалила их.

Но, я не думаю, что из-за этого страдает скорость админ-панели при импорте. Так, что скорее всего нужна оптимизация.

Share this post


Link to post
Share on other sites
1 час назад, markimax сказал:


 

Так что вам индексы здесь не помогут

а как же FULLTEXT INDEX ?

Share this post


Link to post
Share on other sites
50 minutes ago, freelancer said:

а как же FULLTEXT INDEX ?

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

Share this post


Link to post
Share on other sites
Только что, sv2109 сказал:

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

 

как же вы тогда ищите без LIKE и без match against? если это не коммерческая тайна разумеется

Share this post


Link to post
Share on other sites
15 минут назад, freelancer сказал:

а как же FULLTEXT INDEX ?

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

Странность в другом. Кол-во товара на сайте не менялось пару лет, никаких дополнений не вносилось. Кол-во посетителей возросло незначительно. Как могут 6-8 медленных запросов влиять так сильно на загрузку/обновление товаров на сайте. Я их вместе связала лишь с тем, что появились они в одно время (запросы и проблемы в импорте). 

Edited by Mila80

Share this post


Link to post
Share on other sites
45 минут назад, freelancer сказал:

а как же FULLTEXT INDEX ?

Никак
При Like %... выборка идет без учета индексов - перебором всех записей в таблице

match against  тоже тормоза на больших базах
Полнотекстовый поиск в MySQL это тормоза еще те

Сфинкс частично решает проблему, если грамотно настроить

Share this post


Link to post
Share on other sites
31 minutes ago, freelancer said:

 

как же вы тогда ищите без LIKE и без match against? если это не коммерческая тайна разумеется

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

 

30 minutes ago, Mila80 said:

 Как могут 6-8 медленных запросов влиять так сильно на загрузку/обновление товаров на сайте. Я их вместе связала лишь с тем, что появились они в одно время (запросы и проблемы в импорте). 


если поиск работает медленно то это создает нагрузку на сервер и если в тоже самое время вы делаете импорт товаров, то он естественно тоже тормозит, так как сервер точно в это же время обрабатывает сложный поисковый запрос + добавляется еще нагрузка от импорта, который тоже может создавать приличную нагрузку, это накладывается одно на другое и получаем ошибку 504, то есть серверу не хватает времени чтобы обработать запрос. Решений несколько: установить более быстрый модуль поиска, установить более мощный сервер, увеличить время выполнения скриптов на сервере.

Share this post


Link to post
Share on other sites
2 часа назад, sv2109 сказал:

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

вы этот запрос выполните на своём сервере и посмотрите сколько времени он отрабатывает

Share this post


Link to post
Share on other sites

Вообще -то запрос немного не туда-сюда

Допусти он медленный

Но нагрузка и медленная работа совсем не связана с этим запросом (или подобным)

Если уж разбирать запрос, то спрашивается, зачем искать по "2" , релевантность в таком случае практически нулевая

 

Кто автор такого запроса?
 

Share this post


Link to post
Share on other sites
2 часа назад, freelancer сказал:

на своём сервере

Запрос занял 6.4658 сек. 

Edited by Mila80

Share this post


Link to post
Share on other sites
1 час назад, chukcha сказал:

Кто автор такого запроса?
 

Модуль поиска хоть и старой модификации, искал и ищет по сайту быстро, проблем не было еще неделю назад, а потом раз, и что-то пошло не так (существенных изменений на сайте не было) 

Share this post


Link to post
Share on other sites

Спасибо всем, кто откликнулся - помогли. Медленные запросы прекратились после удаления модуля Поиска. Медленные запросы никак не связаны с ошибкой 504 при загрузке прайс-листов.

Share this post


Link to post
Share on other sites

@Mila80 не подскажите модуль, который был причиной таким медленным запросам?

Share this post


Link to post
Share on other sites
5 минут назад, freelancer сказал:

@Mila80 не подскажите модуль, который был причиной таким медленным запросам?

Поисковая система с морфологией и релевантностью (возможно самая первая версия этого модуля). Модуль куплен очень давно, работал исправно и не давал сбоев ранее. Спасибо автору модуля, что написал  и указал возможные причины сбоев, а именно рост сайта.

 

Share this post


Link to post
Share on other sites
34 minutes ago, freelancer said:

@Mila80 не подскажите модуль, который был причиной таким медленным запросам?

это мой модуль, у пользователя стояла очень старая версия этого модуля, купленная лет 5 назад + модуль был не настроен правильно, так как был поиск по очень многим полям и по вхождению (а это влияет на скорость) и мин. длина слова для поиска судя по запросу стояла 1 символ, это добавляет в запрос поиск по напр. "2" что имеет мало смысла. И так далее. 

Share this post


Link to post
Share on other sites
Just now, Mila80 said:

Поисковая система с морфологией и релевантностью (возможно самая первая версия этого модуля). Модуль куплен очень давно, работал исправно и не давал сбоев ранее. Спасибо автору модуля, что написал  и указал возможные причины сбоев, а именно рост сайта.

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Similar Content

    • By so0EmFD190
      SET timestamp=1540805733;
      # Query_time: 1.707224  Lock_time: 0.000562  Rows_sent: 25  Rows_examined: 808258

      SELECT value_id, option_id, total FROM (SELECT p.manufacturer_id AS value_id, 'm' AS option_id, COUNT(p.manufacturer_id) AS total FROM oc_product p LEFT JOIN oc_product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p.status = '1' AND p2c.category_id = '82' AND p.product_id IN(SELECT oov2p1.product_id FROM oc_ocfilter_option_value_to_product oov2p1 INNER JOIN oc_ocfilter_option_value_to_product oov2p2 ON (oov2p1.product_id = oov2p2.product_id) WHERE oov2p1.option_id = '30425' AND (oov2p1.value_id = '1742734348' OR oov2p1.value_id = '2076164755') AND oov2p2.option_id = '30454' AND (oov2p2.value_id = '1093219734')) GROUP BY p.manufacturer_id UNION ALL SELECT p.stock_status_id AS value_id, 's' AS option_id, COUNT(p.stock_status_id) AS total FROM oc_product p LEFT JOIN oc_product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p.status = '1' AND p2c.category_id = '82' AND (p.manufacturer_id = '66') AND p.product_id IN(SELECT oov2p1.product_id FROM oc_ocfilter_option_value_to_product oov2p1 INNER JOIN oc_ocfilter_option_value_to_product oov2p2 ON (oov2p1.product_id = oov2p2.product_id) WHERE oov2p1.option_id = '30425' AND (oov2p1.value_id = '1742734348' OR oov2p1.value_id = '2076164755') AND oov2p2.option_id = '30454' AND (oov2p2.value_id = '1093219734')) GROUP BY p.stock_status_id UNION ALL SELECT oov2p.value_id, oov2p.option_id, COUNT(p.product_id) AS total FROM oc_ocfilter_option_value_to_product oov2p LEFT JOIN oc_product_to_category p2c ON (oov2p.product_id = p2c.product_id) LEFT JOIN oc_product p ON (oov2p.product_id = p.product_id) WHERE oov2p.value_id > '0' AND p.status = '1' AND p2c.category_id = '82' AND (p.manufacturer_id = '66') AND p.product_id IN(SELECT oov2p1.product_id FROM oc_ocfilter_option_value_to_product oov2p1 INNER JOIN oc_ocfilter_option_value_to_product oov2p2 ON (oov2p1.product_id = oov2p2.product_id) WHERE oov2p1.option_id = '30425' AND (oov2p1.value_id = '1742734348' OR oov2p1.value_id = '2076164755') AND oov2p2.option_id = '30454' AND (oov2p2.value_id = '1093219734')) GROUP BY oov2p.option_id, oov2p.value_id UNION ALL SELECT oov2p.value_id, oov2p.option_id, COUNT(p.product_id) AS total FROM oc_product p LEFT JOIN oc_product_to_category p2c ON (p.product_id = p2c.product_id) LEFT JOIN oc_ocfilter_option_value_to_product oov2p ON (p.product_id = oov2p.product_id) WHERE oov2p.option_id = '30425' AND p.status = '1' AND p2c.category_id = '82' AND (p.manufacturer_id = '66') AND p.product_id IN(SELECT oov2p1.product_id FROM oc_ocfilter_option_value_to_product oov2p1 WHERE oov2p1.option_id = '30454' AND (oov2p1.value_id = '1093219734')) GROUP BY oov2p.option_id, oov2p.value_id UNION ALL SELECT oov2p.value_id, oov2p.option_id, COUNT(p.product_id) AS total FROM oc_product p LEFT JOIN oc_product_to_category p2c ON (p.product_id = p2c.product_id) LEFT JOIN oc_ocfilter_option_value_to_product oov2p ON (p.product_id = oov2p.product_id) WHERE oov2p.option_id = '30454' AND p.status = '1' AND p2c.category_id = '82' AND (p.manufacturer_id = '66') AND p.product_id IN(SELECT oov2p1.product_id FROM oc_ocfilter_option_value_to_product oov2p1 WHERE oov2p1.option_id = '30425' AND (oov2p1.value_id = '1742734348' OR oov2p1.value_id = '2076164755')) GROUP BY oov2p.option_id, oov2p.value_id) results LIMIT 0, 25;
    • By leshavasykov
      Привет, помогите пожалуйста решить проблему с медленными запросами, хостинг выдает такой медленный запрос:
       
      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_discount pd2 WHEREpd2.product_id = p.product_id AND pd2.customer_group_id = '1' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDERBY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM oc_product_special ps WHEREps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' ORps.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 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.quantity>0) DESC,p.date_added DESC, LCASE(pd.name) DESC LIMIT 0,10
       
      Что это может значит и как можно убрать этот запрос? 
       
    • By Aky
      Как передать POST параметр через ajax в файл controller модуля OpenCart ?
       
      Есть модуль "latest"  Файл контроллера latest.php, нужно передать туда параметр width через Ajax/Jquery  
       
      Как обратится к этому файлу? 
       
      Как работать с Ajax знаю, как параметры передать знаю, как принять знаю, но как обратится к нужному файлу в OpenCart?
       
      При попытках обращения по "url:' скрипт выдает ошибку  "404 (not found)"
       
      Пробовал вот так:
      url: 'index.php?route=extension/module/latest',  url: 'index.php?route=module/latest',  url: '/catalog/controller/extension/module/latest',   
      Если перейти на прямую по ссылки: "/catalog/controller/extension/module/latest.php"  выдает ошибку HTTP ERROR 500
    • By mario512
      Добрый вечер. Подскажите какие существенные отличия данных конструкций:
      INSERT INTO `oc_product_attribute`(`product_id`,`attribute_id`,`language_id`,`text`)VALUES(100,16,1,"xczczxc") и
      INSERT INTO oc_product_attribute SET product_id = 101, attribute_id = 25, language_id = 1, text = "xczczxc" И какую лучше использовать?
    • By Eldaeron
      Здравствуйте, помогите. Не сильный в mysql, но нужно выбрать некоторую информацию.
       
      Из готовых заказов, те что выполненны нужно взять те что заказали с этого года по сегодня, легко:
      SELECT * FROM oc_order WHERE oc_order.order_status_id = 19 AND oc_order.date_modified BETWEEN '2018-01-01 00:00:00' AND '2018-02-02 23:59:59' Например нашло 30 заказов, скажем ид 3000 - 3030, как дальше выбрать все товары, это таблица oc_order_product
       
      Через цикл foreach? Или модифицировать 1 запрос вот так?
      SELECT * FROM oc_order_product WHERE oc_order_product.order_id in (SELECT oc_order.order_id FROM oc_order WHERE oc_order.order_status_id = 19 AND oc_order.date_modified BETWEEN '2018-01-01 00:00:00' AND '2018-02-02 23:59:59') И потом ище выбрать только те товары у которых производитель Apple (manufacturer_id = 1)
       
      В таблице oc_order_product нет колонки manufacturer, но зато она есть в oc_product
       
      Как тут быть? Что-то думаю нужно взять JOIN, но как сделать запрос так и не понял)
       
      Какими программами вы пользуетесь для построенния таких сложных запросов mysql для разработки своих дополнений?
       
      Надеюсь на понимание, спасибо.
  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.