Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Sign Up

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


Recommended Posts

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

# Time: 160823 13:33:31
# [email protected]: 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;
 
Нужно как-то оптимизировать его, это при поиске товара, и когда наверное нажимаешь его открыть , выполняется этот запрос. Думаю кому-то тоже это нужно, не только мне
Link to post
Share on other sites

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

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

 

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

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

Link to post
Share on other sites

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

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

Link to post
Share on other sites

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

 

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

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

 

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

 

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

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

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

Link to post
Share on other sites

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

 

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

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

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

Link to post
Share on other sites

 + 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
Link to post
Share on other sites

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

 

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

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

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.