Jump to content
Dimdimych

Ускорение обработки запросов mysql

Recommended Posts

Здравствуйте, уважаемые форумчане. Пытаюсь разобраться с тормозами сайта на ocStore 2.1.0.1 (на сайте примерно 3000 товаров) Решил проверить скорость и количество запросов у себя на сайте и вот какие данные получил для главной страницы:server_time.PNG

 

Анализ запросов к базе данных дал такие результаты (при чистом кєше):  Queries: 918, Total time: 734.030 ms

А вот самые медленные запросы:

sql_zapros.PNG

Подскажите, количество запросов 918 - это очень много? И как можно сократить время этих запросов? (индексы таблицам проставлены). Ткните носом, в каком направлении копать?

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

Чего стоит только один запрос считающий количество проданного товара

Share this post


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

Много

А какие модули стоят ?

Да уж много модулей стоит: SeoGen 2.0.5, Image Manager Pro+, SORTS+, SEO CMS (+мультиязык), Magic Zoom Plus, SOFORP SMS Информер, After Purchase Review Invitation, Email Template - Advanced, GeoIP, Mega Filter PRO, Rev Slider Opencart, YO • Меню, Акции, подарки [sv2109.com], Группы товаров ( louise170 ), Модуль Настройки заказов ( Alex.Konushin ), Поиск с вариантами [sv2109.com], Поиск с морфологией и релевантностью PRO [sv2109.com], Простая регистрация и заказ Simple, Статусы Товаров PRO [sv2109.com], Оплата после проверки и/или оплата на реквизиты, Доставка Плюс ( louise170 ), Новая Почта API, Менеджер скидок/наценок ( louise170), Система поощрения и лояльности клиентов ( sergius_sv ), а так же мод, изменяющий кнопку купить в зависимости от состояния на складе.

Как видите, достаточно много, но они мне все нужны... Кроме этого использую тему MAGAZIN, а там еще хватает своих модулей.

Share this post


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

какой именно кэш чистый?

Имел ввиду - почистил системный кэш и кэш изображений движка и кэш браузера

Share this post


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

Имел ввиду - почистил системный кэш и кэш изображений движка и кэш браузера

Приходите ко мне в личку.
Долго Дорого Хорошо!

Share this post


Link to post
Share on other sites

Мне вот не понятна такая ситуация: есть некоторые товары, которые ну ооочень долго грузятся. Если обычно у товара Queries: 475, Total time: 574.206 ms , то у некоторых товаров  Queries: 1885, Total time: 4,281.468 ms. Причем специально создавал новый товар с контентом и настройками, как у тормознутого товара и у этого товара было намного меньше запросов. Я вручную переносил базу данных с 1.5 на 2.1 и заметил, что попадаются такие тормознутые товары (их не так много) только созданные еще на 1.5. Вот я не могу понять, с чем это может быть связано, ладно бы все старые товары имели много запросов, а то только некоторые и логики, какие из них будут с тормозами я не вижу...

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

отключать-включать-мерить время-сравнивать-искать-оптимизировать. и там как повезет.

Очень мало модуле-писателей пробовали с 3000 товаров

Share this post


Link to post
Share on other sites

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

Share this post


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

отключать-включать-мерить время-сравнивать-искать-оптимизировать. и там как повезет.

Очень мало модуле-писателей пробовали с 3000 товаров

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

да и в целом 3000 это смешная цифра для разговора о нагрузках из-за кол-ва

Share this post


Link to post
Share on other sites

Просмотрел лог запросов - большая часть - это однотипные запросы  по 3-4 мс типа:

SELECT DISTINCT *, pd.name AS name, p.image, (SELECT md.name 
FROM oc_manufacturer_description md 
WHERE md.manufacturer_id = p.manufacturer_id AND md.language_id = '1') AS manufacturer, (SELECT price 
FROM oc_product_discount pd2 
WHERE pd2.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())) 
ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (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 points 
FROM oc_product_reward pr 
WHERE pr.product_id = p.product_id AND customer_group_id = '1') AS reward, (SELECT ss.name 
FROM oc_stock_status ss 
WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '1') AS stock_status, (SELECT wcd.unit 
FROM oc_weight_class_description wcd 
WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '1') AS weight_class, (SELECT lcd.unit 
FROM oc_length_class_description lcd 
WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '1') AS length_class, (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 COUNT(*) AS total 
FROM oc_review r2 
WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order 
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) 
LEFT JOIN oc_manufacturer m ON (p.manufacturer_id = m.manufacturer_id) 
WHERE p.product_id = '1674' AND pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0'

Меняется только p.product_id = '1674'. 

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
1 час назад, Otvet сказал:

да и в целом 3000 это смешная цифра для разговора о нагрузках из-за кол-ва

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

Share this post


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

и сколько их? Кто-то зачем-то по одному товару дергает. Сколько же их на странице то?

 

34 минуты назад, chukcha сказал:

Ну, так наверное огромная куча связанных товаров

Сопутствующих товаров у рассматриваемого товара - 8 шт. А запросов, блин, я даже сразу не сосчитаю, но на вид 60-70% от 1885 запросов...

Edited by Dimdimych

Share this post


Link to post
Share on other sites

Ну так ищите источник!!!

Share this post


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

Ну так ищите источник!!!

А искать, как markimax предлагал?

3 часа назад, markimax сказал:

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

 

Share this post


Link to post
Share on other sites

Зачем?

 

Искать какой модуль вызывает запрос, а не только смотреть запрос.

Share this post


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

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

Это очень затруднительно.. и глупо, если можно ускорить процесс обнаружения.

Share this post


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

Это очень затруднительно.. и глупо, если можно ускорить процесс обнаружения.

А каким образом можно ускорить процесс обнаружения?

Share this post


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

А запросов, блин, я даже сразу не сосчитаю, но на вид 60-70% от 1885 запросов...

Это стандартный запрос на выборку товара (метод getProduct в /catalog/model/catalog/product.php), так что этих запросов и должно быть много (имею ввиду запрос из этого поста:

Но этих запросов не должно быть больше, чем товаров на конкретной странице.

 

Если запросов больше, чем должно быть, ищите места использования getProduct.

  • +1 1

Share this post


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

Это очень затруднительно..

Это почему же ? Да еще с таким "громким" заявлением
Да я бы нашел быстрее, как и любой профессионал.
Но если у пользователя нет квалификации ему надо подсказать путь, какой ему проще.
Отключаешь модуль и смотришь количество запросов - логично и просто.
Если после какого то модуля резко упадет количество запросов - тот  и "папа"
 

  • +1 1

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.


  • 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.