Postgresql 如果我已经使用了GIN索引,如何优化查询

Postgresql 如果我已经使用了GIN索引,如何优化查询,postgresql,Postgresql,我使用(PostgreSQL)11.8,并尝试通过一些列提供全文搜索机会。为此,我创建了带有多个字段的GIN索引并合并。在我的数据库grewto 344747行之后,我在查询中遇到了执行缓慢的问题。当我执行查询示例时,我面临大约4.6秒的时间。在分析信息时,我看到使用了索引,但仍然很慢。npdbcs_瑞典_自定义_索引上的位图索引扫描存在。如果我做出正确的结论,我要花很多时间来分组。有人知道如何优化此查询的任何方法或建议吗?因为我无法想象当我的数据库增长到1000万个产品时,它将如何工作?大多数

我使用(PostgreSQL)11.8,并尝试通过一些列提供全文搜索机会。为此,我创建了带有多个字段的GIN索引并合并。在我的数据库grewto 344747行之后,我在查询中遇到了执行缓慢的问题。当我执行查询示例时,我面临大约4.6秒的时间。在分析信息时,我看到使用了索引,但仍然很慢。npdbcs_瑞典_自定义_索引上的位图索引扫描存在。如果我做出正确的结论,我要花很多时间来分组。有人知道如何优化此查询的任何方法或建议吗?因为我无法想象当我的数据库增长到1000万个产品时,它将如何工作?大多数人希望数据来自分析-
计划时间:0.790 ms
这是可能的

->  GroupAggregate  (cost=27625.67..47476.93 rows=10284 width=928) (actual time=32.328..4490.279 rows=6634 loops=1)
我的索引

create index npdbcs_swedish_custom_index on products
                    using GIN(to_tsvector('pg_catalog.swedish', name||price||description||brand||category||shop))
还有我的问题

 EXPLAIN ANALYZE
        SELECT                         
            products_alias.id,
            products_alias.sku,
            products_alias.name AS "name",
            products_alias.description,
            products_alias.category,
            products_alias.price,
            products_alias.shipping,
            products_alias.currency,
            products_alias.instock,
            products_alias.product_url AS "productUrl",
            products_alias.image_url AS "imageUrl",
            products_alias.tracking_url AS "trackingUrl",
            products_alias.brand,
            products_alias.shop,
            products_alias.original_price AS "originalPrice",
            products_alias.ean,
            products_alias.manufacturer_article_number AS "manufacturerArticleNumber",
            products_alias.extras,
            products_alias.created_at AS "createdAt",
            products_alias.brand_relation_id AS "brandRelationId",
            products_alias.shop_relation_id AS "shopRelationId",
            array_agg(DISTINCT cpt.category_id) AS categoryIds,
            COUNT(DISTINCT uip.id) as "numberOfEntries",
            ts_rank_cd(to_tsvector('pg_catalog.swedish', products_alias.name||products_alias.price||products_alias.description||products_alias.brand||products_alias.category||products_alias.shop), to_tsquery('pg_catalog.swedish', 'AeroMoov&Air&Layer™&Group&2&Sittdyna&Mörkgrå&One&Size:*|329.00|AeroMoov|Liggdelar|Duovagnar|Barnvagnar|Solskydd')) AS rank

        FROM products products_alias 
        LEFT JOIN user_ip_product uip on uip.products_id = products_alias.id 
                LEFT JOIN product_category cpt on cpt.product_id = products_alias.id
                WHERE to_tsvector('pg_catalog.swedish', products_alias.name||products_alias.price||products_alias.description||products_alias.brand||products_alias.category||products_alias.shop) @@ to_tsquery('pg_catalog.swedish', 'AeroMoov&Air&Layer™&Group&2&Sittdyna&Mörkgrå&One&Size:*|329.00|AeroMoov|Liggdelar|Duovagnar|Barnvagnar|Solskydd')             
        AND products_alias.id != 810429                                         
        GROUP BY products_alias.id ORDER BY rank DESC                                          
        LIMIT 4
        OFFSET 0;



Limit  (cost=47631.19..47631.20 rows=4 width=928) (actual time=4401.654..4401.656 rows=4 loops=1)
  ->  Sort  (cost=47631.19..47656.90 rows=10284 width=928) (actual time=4401.652..4401.653 rows=4 loops=1)
        Sort Key: (ts_rank_cd(to_tsvector('swedish'::regconfig, ((((((products_alias.name)::text || (products_alias.price)::text) || products_alias.description) || (products_alias.brand)::text) || (products_alias.category)::text) || (products_alias.shop)::text)), '''aeromoov'' & ''air'' & ''layer'' & ''group'' & ''2'' & ''sittdyn'' & ''mörkgrå'' & ''one'' & ''siz'':* | ''329.00'' | ''aeromoov'' | ''liggdel'' | ''duovagn'' | ''barnvagn'' | ''solskyd'''::tsquery)) DESC
        Sort Method: top-N heapsort  Memory: 31kB
        ->  GroupAggregate  (cost=27625.67..47476.93 rows=10284 width=928) (actual time=31.780..4382.917 rows=6634 loops=1)
              Group Key: products_alias.id
              ->  Gather Merge  (cost=27625.67..44420.18 rows=20203 width=892) (actual time=31.096..88.389 rows=13451 loops=1)
                    Workers Planned: 2
                    Workers Launched: 2
                    ->  Nested Loop Left Join  (cost=26625.65..41088.23 rows=8418 width=892) (actual time=24.549..52.293 rows=4484 loops=3)
                          ->  Merge Left Join  (cost=26625.22..26646.92 rows=4285 width=888) (actual time=24.513..29.039 rows=2212 loops=3)
                                Merge Cond: (products_alias.id = uip.products_id)
                                ->  Sort  (cost=26622.18..26632.89 rows=4285 width=884) (actual time=24.430..26.065 rows=2211 loops=3)
                                      Sort Key: products_alias.id
                                      Sort Method: external merge  Disk: 2808kB
                                      Worker 0:  Sort Method: quicksort  Memory: 3261kB
                                      Worker 1:  Sort Method: quicksort  Memory: 2112kB
                                      ->  Parallel Bitmap Heap Scan on products products_alias  (cost=283.70..26363.68 rows=4285 width=884) (actual time=8.825..17.986 rows=2211 loops=3)
                                            Recheck Cond: (to_tsvector('swedish'::regconfig, ((((((name)::text || (price)::text) || description) || (brand)::text) || (category)::text) || (shop)::text)) @@ '''aeromoov'' & ''air'' & ''layer'' & ''group'' & ''2'' & ''sittdyn'' & ''mörkgrå'' & ''one'' & ''siz'':* | ''329.00'' | ''aeromoov'' | ''liggdel'' | ''duovagn'' | ''barnvagn'' | ''solskyd'''::tsquery)
                                            Filter: (id <> 810429)
                                            Rows Removed by Filter: 0
                                            Heap Blocks: exact=2563
                                            ->  Bitmap Index Scan on npdbcs_swedish_custom_index  (cost=0.00..281.13 rows=10284 width=0) (actual time=10.858..10.859 rows=6635 loops=1)
                                                  Index Cond: (to_tsvector('swedish'::regconfig, ((((((name)::text || (price)::text) || description) || (brand)::text) || (category)::text) || (shop)::text)) @@ '''aeromoov'' & ''air'' & ''layer'' & ''group'' & ''2'' & ''sittdyn'' & ''mörkgrå'' & ''one'' & ''siz'':* | ''329.00'' | ''aeromoov'' | ''liggdel'' | ''duovagn'' | ''barnvagn'' | ''solskyd'''::tsquery)
                                ->  Sort  (cost=3.05..3.18 rows=53 width=8) (actual time=0.070..0.086 rows=59 loops=3)
                                      Sort Key: uip.products_id
                                      Sort Method: quicksort  Memory: 27kB
                                      Worker 0:  Sort Method: quicksort  Memory: 27kB
                                      Worker 1:  Sort Method: quicksort  Memory: 27kB
                                      ->  Seq Scan on user_ip_product uip  (cost=0.00..1.53 rows=53 width=8) (actual time=0.030..0.040 rows=59 loops=3)
                          ->  Index Scan using idx_cdfc73564584665a on product_category cpt  (cost=0.42..3.34 rows=3 width=8) (actual time=0.007..0.009 rows=2 loops=6636)
                                Index Cond: (product_id = products_alias.id)
Planning Time: 0.660 ms
Execution Time: 4402.940 ms
解释分析
挑选
产品名称,
产品(别名:sku),
产品的别名为“名称”,
产品名称和说明,
产品类别,
产品价格,
产品与运输,
产品和货币,
产品名称:instock,
products\u别名。product\u url为“productUrl”,
产品\u别名.image\u url为“imageUrl”,
产品\u别名.tracking\u url为“trackingUrl”,
品牌产品,
产品销售部,
产品别名。原价为“原价”,
产品(别名),
产品\别名.制造商\商品\编号为“制造商技术编号”,
产品附加费,
产品_别名.已创建_地址为“createdAt”,
产品\别名.品牌\关系\标识为“brandRelationId”,
产品\u别名.shop\u关系\u id为“shopRelationId”,
数组_agg(不同的cpt.category_id)作为categoryId,
将(不同的uip.id)计数为“numberOfEntries”,
ts|u rank|u cd(to|tsvector('pg|U catalog.swedish',products|U alias.name | products|U alias.price | products|U alias.description | products|U alias.shop),to tsquery('pg|U catalog.swedish',AeroMoov&Air&Layer™&第二组和第二组以及第二组和第二组:*329.00 | AeroMoov | Liggdelar | Duovagnar | Barnvagnar | Solskyd'))排名
来自products\u别名
在uip.products\u id=products\u alias.id上左加入用户\u ip\u产品uip
在cpt.product\U id=products\U alias.id上左连接产品\U类别cpt
何处到| tsvector('pg|catalog.swedish',products|u alias.name | products|u alias.price | products|u alias.description | products|u alias.shop)@@to|tsquery('pg u catalog.swedish AeroMoov&Air&Layer™&第二组和第二组、第二组和第二组、第二组和第二组和第二组:*329.00 | AeroMoov | Liggdelar | Duovagnar | Barnvagnar | Solskyd')
和产品_alias.id!=810429
按产品分组\u别名.id按等级说明排序
限制4
偏移量0;
限制(成本=47631.19..47631.20行=4宽度=928)(实际时间=4401.654..4401.656行=4圈=1)
->排序(成本=47631.19..47656.90行=10284宽度=928)(实际时间=4401.652..4401.653行=4个循环=1)
排序键:(ts|rank|cd(to|tsvector(‘瑞典语’::regconfig,(((((products|alias.name)::text(products|alias.price)::text)| products|alias.description)|(products|alias.brand::text)|(products|alias.category::text)|(products|alias.shop::text))“aeromoov”“air”“layer”“group”“2”“sittdyn”“mörkgr唓one”“siz:*|”“329.00”“aeromoov”“liggdel”“duovagn”“barnvagn”“solskyd”“::tsquery)描述
排序方法:top-N堆口内存:31kB
->GroupAggregate(成本=27625.67..47476.93行=10284宽=928)(实际时间=31.780..4382.917行=6634圈=1)
组密钥:products\u alias.id
->聚集合并(成本=27625.67..44420.18行=20203宽度=892)(实际时间=31.096..88.389行=13451循环=1)
计划人数:2人
劳工处推出:2
->嵌套循环左连接(成本=26625.65..41088.23行=8418宽度=892)(实际时间=24.549..52.293行=4484个循环=3)
->合并左连接(成本=26625.22..26646.92行=4285宽度=888)(实际时间=24.513..29.039行=2212循环=3)
合并条件:(products\u alias.id=uip.products\u id)
->排序(成本=26622.18..26632.89行=4285宽度=884)(实际时间=24.430..26.065行=2211循环=3)
排序键:products\u alias.id
排序方法:外部合并磁盘:2808kB
辅助进程0:排序方法:快速排序内存:3261kB
辅助进程1:排序方法:快速排序内存:2112kB
->产品别名上的并行位图堆扫描(成本=283.70..26363.68行=4285宽度=884)(实际时间=8.825..17.986行=2211循环=3)
重新检查条件:(to|tsvector(‘瑞典语’::regconfig,(((((名称)::text | |(价格)::text)|说明)|(品牌)::text)|(类别)::text)|(商店)::text))“aeromoov”“air”“layer”“group”“2”“sittdyn”“mörkgr唓one”“siz:*|”“329.00”“aeromoov”“liggdel”“duovagn”“barnvagn”“solskyd”“::tsquery)
过滤器:(id 810429)
已被筛选器删除的行:0
堆块:精确=2563
->npdbcs_瑞典_自定义_索引上的位图索引扫描(成本=0.00..281.13行=10284宽度=0)(实际时间=10.858..10.859行=66