Фильтр товаров грузит БД

Здравствуйте.

Периодически вешается mysql из-за большого количества "медленных" запросов вида:

SELECT DISTINCT pf.feature_id, pf.feature_value_id
FROM (
        SELECT p.id
        FROM shop_product p
        JOIN shop_product_features pf1
                ON p.id = pf1.product_id
        JOIN shop_product_skus ps1
                ON ps1.product_id = p.id
        JOIN shop_category_products cp1
                ON p.id = cp1.product_id
WHERE ps1.available = 1
        AND p.status = 1
        AND cp1.category_id IN(657,658,659,660,661,662,663,671,672,673,674,717,718,719,730,731,734,735,770,776,794,795,796,797,799,800,801,802,803,804,806,809,810,811,812,813,814,815,816,817,818,821,822,823,824,825,826,830,831,832,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,858,872,873,874,876,877,878,880,881,882,981,982,983,984,985,986,987,1186,1187,1189,1190,1211,1312,1313,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1401,1428,1429,1431,1432,1433,1434,1437,1438,1439,1440,1453,1624,1625,1626,1627,1628,1629,1799,1800,1801,1802,1803,1804,1805,1806,1808,1990,1991,1992,1993,3111,6978,6979,6981,6982,7005)
        GROUP BY p.id
) p
JOIN shop_product_features pf
ON p.id = pf.product_id

Время выполнения порядка 2х секунд. При количестве посещений страниц категорий одновременно пользователями получается постоянно "хорошая" нагрузка на mysql. 
Таблицы сделаны InnoDB. 
В результате выполнения запроса выводятся id характеристики и id значения. Всего 244 страницы. Скрин приложил.

Не понимаю - это выборка характеристик с их значениями для страницы категории. Откуда она берется?
Вопрос: зачем в запросе идет перечисление id категорий с длинной портянкой значений?
Есть подозрение, что идет переборка категорий, в которых добавлены товары, помимо той, в которой происходит фильтрация.

p.s. всего порядка 80 характеристик. бОльшая часть из из типа select со значениями от 5 до 50 различных вариантов.
p.p.s фильтры сделаны через метод exist

1 ответ

  • 0

    Ставлю на фильтр хар-к в категориях)

    Таблицы сделаны InnoDB.

    Неужели чуда не произошло и база не воскресла?

    зачем в запросе идет перечисление id категорий с длинной портянкой значений?

    и другие самые смешные вопросы наших специалистов...

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

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите