Перейти к содержанию
volchonok27

Ускорение опенкарт 2.1 Нужно ускорить работу запроса

Рекомендуемые сообщения

Привет всем. нужно помощь по оптимизации opencart 2.1, будет около 50000 товаров и 700 категорий. Нагрузил магазины тестовыми товарами около 60000 тысяч. И нужно по максу ускорить его работу. А первое что жалуется в журнале медленных запросов , такой запрос:

# Time: 160823 13:33:31
# User@Host: admin_moto[admin_moto] @ localhost []
# Query_time: 6.475727  Lock_time: 0.000153 Rows_sent: 0  Rows_examined: 3433933
SET timestamp=1471959211;
SELECT
`c`.`parent_id`,
`c`.`category_id`,`cd`.`name`,
(
 
SELECT
COUNT(DISTINCT `p`.`product_id`) AS total
FROM
`oc_product_to_category` AS `p2c`
INNER JOIN
`oc_product` AS `p`
ON
`p`.`product_id` = `p2c`.`product_id`
INNER JOIN
`oc_category_path` AS `cp`
ON
`cp`.`category_id` = `p2c`.`category_id`
 
INNER JOIN
`oc_product_to_store` AS `p2s`
ON
`p2s`.`product_id` = `p`.`product_id` AND `p2s`.`store_id` = 0
 
INNER JOIN
`oc_product_description` AS `pd`
ON
`pd`.`product_id` = `p`.`product_id` AND `pd`.`language_id` = 4
 
WHERE `p`.`date_available` <= NOW() AND `p`.`status` = '1' AND ((LCASE(`pd`.`name`) LIKE '%aaasimq%') OR LCASE(`p`.`model`) = 'aaasimq ' OR LCASE(`p`.`sku`) = 'aaasimq ' OR LCASE(`p`.`upc`) = 'aaasimq ' OR LCASE(`p`.`ean`) = 'aaasimq ' OR LCASE(`p`.`jan`) = 'aaasimq ' OR LCASE(`p`.`isbn`) = 'aaasimq ' OR LCASE(`p`.`mpn`) = 'aaasimq ' OR LCASE(`pd`.`tag`) LIKE '%aaasimq %') AND `cp`.`path_id` = `c`.`category_id`
 
) AS `aggregate`
FROM
`oc_category` AS `c`
INNER JOIN
`oc_category_description` AS `cd`
ON
`cd`.`category_id` = `c`.`category_id` AND `cd`.`language_id` = '4'
INNER JOIN
`oc_category_to_store` AS `c2s`
ON
`c`.`category_id` = `c2s`.`category_id` AND `c2s`.`store_id` = '0'
WHERE
`c`.`status` = '1' AND `c`.`parent_id` = 0
GROUP BY
`c`.`category_id`
HAVING
`aggregate` > 0
ORDER BY
`c`.`sort_order` ASC, `cd`.`name` ASC;
 
Нужно как-то оптимизировать его, это при поиске товара, и когда наверное нажимаешь его открыть , выполняется этот запрос. Думаю кому-то тоже это нужно, не только мне

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это ж подсчет товаров. Отключите в админке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это ж подсчет товаров. Отключите в админке.

Скорей всего это какой-то из фильтров

 

1. Потому что это не в стиле  OC ипользовать JOIN (INNER JOIN)

2. Наличие HAVING - фильтрует уже полученный ответ - что на больших данных значительно тормозит

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это ж подсчет товаров. Отключите в админке.

подсчет у меня отключен

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

порой недостаточно просто отключить в админке

 

ищите в файлах по коду

SELECT COUNT(DISTINCT `p`.`product_id`) AS total
смотрите что за модули к нему обращаются и обходите по-возможности

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

порой недостаточно просто отключить в админке

 

ищите в файлах по коду

SELECT COUNT(DISTINCT `p`.`product_id`) AS total
смотрите что за модули к нему обращаются и обходите по-возможности

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
WHERE `p`.`date_available` <= NOW() AND `p`.`status` = '1' AND ((LCASE(`pd`.`name`) LIKE '%aaasimq%') OR LCASE(`p`.`model`) = 'aaasimq ' OR LCASE(`p`.`sku`) = 'aaasimq ' OR LCASE(`p`.`upc`) = 'aaasimq ' OR LCASE(`p`.`ean`) = 'aaasimq ' OR LCASE(`p`.`jan`) = 'aaasimq ' OR LCASE(`p`.`isbn`) = 'aaasimq ' OR LCASE(`p`.`mpn`) = 'aaasimq ' OR LCASE(`pd`.`tag`) LIKE '%aaasimq %') AND `cp`.`path_id` = `c`.`category_id`

 

Это не запрос - это 3.14 производительности, Like %...% это перебор по всей базе без индексов а еще и OR, Having, Count, IJ и т п  - полный 3.14

 

Советовал бы разбить на простые данный запрос

Чаще получается куча простых выполняются во много раз быстрее одного сложного

Да и их легче оптимизировать при нагрузке и разделить по ресурсам

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 + 5 копеек

`p`.`date_available` <= NOW() 

там вроде доступность в часах минутах секундах не задается, да и с вероятностью 62.471% даже не знает что это такое

AND `c2s`.`store_id` = '0'

с вероятностью 92.412% это не мультимагазин

OR LCASE(`p`.`sku`) = 'aaasimq ' OR LCASE(`p`.`upc`) = 'aaasimq ' OR LCASE(`p`.`ean`) = 'aaasimq ' OR LCASE(`p`.`jan`) = 'aaasimq ' OR LCASE(`p`.`isbn`) = 'aaasimq ' OR LCASE(`p`.`mpn`) = 'aaasimq ' OR LCASE(`pd`.`tag`) 

с вероятностью 98.245% проверки вхождений во всякие jan, mpn и т.д. не нужны

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это какой-то фильтр при поиске, типа найденные товары находятся в таких-то категориях

 

Как его оптимизировать - вопрос  - от потребностей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.