Есть фильтрация большого кол-ва товаров, запрос отрабатывает быстро когда в фильтре нет tag'ов, но как только фильтрую по tag'ам то появляется JOIN и запрос начинает работать очень медленно. Индексы на сортировку, на все внешние ключи присутсвуют.
Подскажите, где можно ещё оптимизировать?
Пример запроса:
SELECT "products_items".* FROM "products_items" JOIN taggings items_taggings_3c0ec20 ON items_taggings_3c0ec20.taggable_id = "products_items".id AND items_taggings_3c0ec20.taggable_type = 'Products::Item' AND items_taggings_3c0ec20.tag_id = 6 WHERE "products_items"."category_id" IN (100369, 5006837, 5006017, 5006016, 5006022, 1002469, 10036892, 5006020, 5008442, 60013, 5006019, 40012899, 60094, 5008441, 10036729, 40013935) AND (image_file_name IS NOT NULL) ORDER BY in_stock DESC, clicks_count DESC, POSITION DESC, old_price, price LIMIT 100 OFFSET 0
QUERY PLAN
Limit (cost=0.84..51889.99 rows=100 width=1303) (actual time=81.411..15097.910 rows=37 loops=1)
-> Nested Loop (cost=0.84..491391.10 rows=947 width=1303) (actual time=81.410..15097.887 rows=37 loops=1)
-> Index Scan using items_sorting_index on products_items (cost=0.43..441553.20 rows=105062 width=1303) (actual time=0.683..14693.876 rows=105726 loops=1)
Filter: ((image_file_name IS NOT NULL) AND (category_id = ANY ('{100369,5006837,5006017,5006016,5006022,1002469,10036892,5006020,5008442,60013,5006019,40012899,60094,5008441,10036729,40013935}'::bigint[])))
Rows Removed by Filter: 972324
-> Index Scan using index_taggings_on_taggable_id_and_taggable_type_and_context on taggings items_taggings_3c0ec20 (cost=0.41..0.46 rows=1 width=4) (actual time=0.003..0.003 rows=0 loops=105726)
Index Cond: ((taggable_id = products_items.id) AND ((taggable_type)::text = 'Products::Item'::text))
Filter: (tag_id = 6)
Rows Removed by Filter: 0
Planning time: 2.468 ms
Execution time: 15097.984 ms
Ты бы оформил свой пост, а то
Ты бы оформил свой пост, а то прочесть это - тяжелый труд
Добавил отступы в EXPLAIN
Добавил отступы в EXPLAIN
Попробуй поменять JOIN
Попробуй поменять
на