Тормоза. Есть способы решения.

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

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

На главной странице магазина выполняется запрос

SELECT * FROM `shop_items_catalog_table`
WHERE  shop_items_catalog_table.shop_items_catalog_is_active = '1'
AND `shop_items_catalog_modification_id` IN (158,159)
ORDER BY shop_items_catalog_order Asc, shop_items_catalog_name Asc;

Суть его я не понял. Выполняется 4 с лишним секунды.
Добавляем индекс (это может сделать любой пользователь с версией до 5.6.0 включтельно, возможно в след. исправят):

alter table shop_items_catalog_table add index (shop_items_catalog_modification_id);

Выполняется теперь 0.007 секунды. Где он был до этого?

Идём дальше.

В корне моего магазина 5 групп, остальные ветвятся многими и многими ветками.
В момент формирования страницы с 5-ю группами выполняется 5 раз следующий запрос, по разу на каждую группу.
Возвращает он все группы с подсчитываеммым для каждой группы кол. товаров. Замечу, групп у меня 549, а товаров 55496.
Этот запрос окучивает 55476 строк с условиями выборки по дате и, до добавления индекса,
фильтром по неиндексируемому полю shop_items_catalog_modification_id,
складвает результат во временный файл для группировки и подсчёта количества товаров в группе,
и возващает результат (группа, кол. товаров) из 549 строк.
Во-первых непонятно как он может испкользоваться на одном, верхнем, уровне групп в магазине.
А во-втрорых самое непонятное, зачем он выполняется 5 раз, кратно количеству групп в тек. ветке.


SELECT shop_groups_id, count(shop_items_catalog_table.shop_items_catalog_item_id) as count
FROM `shop_items_catalog_table`
WHERE `shop_shops_id` = '9'
AND `shop_items_catalog_modification_id` = 0
AND shop_items_catalog_table.shop_items_catalog_is_active = '1' AND (shop_items_catalog_table.shop_items_catalog_putend_date >= '2009-05-14 07:31:40'
OR shop_items_catalog_table.shop_items_catalog_putend_date ='0000-00-00 00:00:00') AND shop_items_catalog_table.shop_items_catalog_putoff_date <= '2009-05-14 07:31:40'
GROUP BY shop_groups_id;


Выполняется 3.7160 сек. итого 18,58 секунд только для верхнего уровня.

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

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

С наилучшими пожеланиями,
желающий помогать и возможно будущий пользователь HostCMS.
Модератор
Re: Тормоза. Есть способы решения.
medved-ltd писал(а):
Добавляем индекс (это может сделать любой пользователь с версией до 5.6.0 включтельно, возможно в след. исправят):

Я Вас удивлю, но в системе создан индекс по этому полю. У меня ощущение, что у Вас по какой то причине посыпались все или часть индексов в базе, потому и проблемы со скоростью работы.
Модератор
Re: Тормоза. Есть способы решения.
Действительно, в некоторые релизы не попало обновление с созданием индексов. Исправление будет доступно в версии 5.6.1.
Re: Тормоза. Есть способы решения.
Инедксы не спасут второй случай никак.
Re: Тормоза. Есть способы решения.
Индексы все на месте, все какие были изначально. Правда я некторые добавил раньше, уже не помню в каких таблицах.
Модератор
Re: Тормоза. Есть способы решения.
medved-ltd,
Второй случай не нужно спасать, он считает количество товаров в группах. Множественные вызовы его исправлены, обновление 5.6.1 должно решить проблему.
Re: Тормоза. Есть способы решения.
Замечу, он считает количество ов всех группах да ещё и через выборку по всем товарам с группировкой, когда из 549 нужно обсчитать только 5. Это можно сделать даже подзапросом, что уже выведет скорость на сверхзвуковую, если вы не знаете как применять "избыточность".

Ну а "множественные" вызовы такого запроса подобны забытым хирургическим ножницам в животе пациента

Ничего личного, жду обновлений. Может ещё что-нибудь откопаю, не расслабляйтесь
Модератор
Re: Тормоза. Есть способы решения.
medved-ltd писал(а):
Замечу, он считает количество ов всех группах да ещё и через выборку по всем товарам с группировкой, когда из 549 нужно обсчитать только 5.

Вы в очередной раз не видите всю суть проблемы. А товары из подгрупп кто считать будет?
Re: Тормоза. Есть способы решения.
select group_id, (select count(*) from items where group_id=g.id) as count from group g where parent_id=<current_level_group_id>
Re: Тормоза. Есть способы решения.
пожно даже делать отдельно для каждой группы запрос (select count (*) from items where group_id=g.id) если на то пошло.
Авторизация