Большой запрос
Не подскажите кто создает такой запрос, и почему не пользуется лимитами?
SELECT DISTINCT pf2.feature_id, pf2.feature_value_id FROM shop_product p JOIN shop_product_skus ps1 ON ps1.product_id = p.id JOIN shop_product_features pf1 ON p.id = pf1.product_id AND pf1.feature_id = 3 JOIN shop_category_products cp1 ON p.id = cp1.product_id JOIN shop_product_features pf2 ON p.id = pf2.product_id WHERE ps1.available > 0 AND ps1.status AND pf1.feature_value_id IN (1534,1552) AND (pf1.sku_id IS NULL OR pf1.sku_id = ps1.id) AND p.status = 1 AND cp1.category_id IN(2730,1799,1891,2650,1607,1123,1667,2025,1999,2757,2019,2113,2752,1901,2008,1677,2127,1763,2062,1678,2158,1090,1989,1960,2021,1094,1681,1006,1680,1676,1125,2024,2026,1936,1944,1600,2153,1801,1581,2120,1755,2027,1915,1932,2064,2228,1890,1147,2747,1122,1126,2308,2307,2309,2300,1894,2206,1679,1121,1951,1902,2142,2649,1898,1010,1922,1008,1016,2066,1590,1926,2293,1378,1895,2253,1897,1937,1941,2648,918,919,1112,1230,2203,2056,2036,2328,944);
Просто есть подозрение, что это после обновления шоп-скрипта, и это базовый код на вывод в категории: товаров с разнообразной выборкой.
Может как то ограничить его, а то в категории, всё равно более 100 товаров, вряд ли кто-то выводит за раз без Пагинации? В базовый код не хотелось бы лезть. На сайте еще установлен фильтры по Ajax, и на больших выборках, тушите свет, сайт просто помирает.
Просто при лимите в 500 записей, у меня он отрабатывается за 0.2 сек при лимите 1000 и более, а на выходе 7700 записей, его время выполнения от 10 секунд и выше. При меньших лимитах 100, вывод занимает 0,026 сек.
Товаров в базе: 18 тысяч, вариаций товаров 132 тысячи, типов характеристик 170, их вариаций около 30 тысяч.
Уточнение, если важно: shop_product: 18246 записей; shop_product_skus: 152280; shop_product_features: 550397; shop_category_products: 94195.
Оптимизация и очистка - сделаны, все таблицы оптимизированы, лишних записей, что указано выше нет.
Полный запрос, длиться примерно 7 секунд, перебирает около 124 млн. записей, не плохо бы его либо переделать, либо решить через создание временных таблиц, благо на сервере они строятся в оперативную память.
2 ответа
Данные про 7 секунд, они были при использовании кэша, результат получается около 7700 записей..
Полный запрос, sql_no_cache:
Query_time: 61.559766 Lock_time: 0.000293 Rows_sent: 817 Rows_examined: 127230840
Фильтр какой-то. Штатный или нет. Или категория динамическая.