我有一个在执行时表现奇怪的psql查询。我为现在用于搜索的两个列定义了一个GIN索引:
Indexes:
"pk_products" PRIMARY KEY, btree (id)
"fk_affiliate_affiliate_product_id" UNIQUE, btree (affiliate_id, affiliate_product_id)
"idx_products" btree (merchant_id)
"idx_products_affiliates" btree (affiliate_id)
"idx_products_brand_id" btree (brand_id)
"idx_products_ts" gin (to_tsvector('english'::regconfig, (COALESCE(title, ''::character varying)::text || ' '::text) || COALESCE(description, ''::text)))
如果我搜索一个长度为4个字符的短词,查询速度会很快:
EXPLAIN ANALYZE SELECT p.id, p.price, p.currency, p.images, p.merchant_id
FROM products AS p
WHERE deleted=false AND to_tsvector('english', p.title || coalesce(p.description, '')) @@ to_tsquery('blue:*')
LIMIT 30 OFFSET 0;
结果:
查询计划
(以下内容需要更多上下文信息才能进行翻译)
Limit (cost=0.00..219.47 rows=30 width=49) (actual time=3.138..40.914 rows=30 loops=1)
-> Seq Scan on products p (cost=0.00..41120.86 rows=5621 width=49) (actual time=2.740..40.478 rows=30 loops=1)
Filter: ((NOT deleted) AND (to_tsvector('english'::regconfig, ((title)::text || COALESCE(description, ''::text))) @@ to_tsquery('blue:*'::text)))
Rows Removed by Filter: 153
Total runtime: 40.986 ms
(5 rows)
如果我使用一个更长的单词:
EXPLAIN ANALYZE SELECT p.id, p.price, p.currency, p.images, p.merchant_id
FROM products AS p
WHERE deleted=false AND to_tsvector('english', p.title || coalesce(p.description, '')) @@ to_tsquery('turquoise:*')
LIMIT 30 OFFSET 0;
时间增加了:
查询计划
Limit (cost=0.00..219.47 rows=30 width=49) (actual time=1.097..1579.187 rows=30 loops=1)
-> Seq Scan on products p (cost=0.00..41120.86 rows=5621 width=49) (actual time=1.093..1579.129 rows=30 loops=1)
Filter: ((NOT deleted) AND (to_tsvector('english'::regconfig, ((title)::text || COALESCE(description, ''::text))) @@ to_tsquery('turquoise:*'::text)))
Rows Removed by Filter: 12697
Total runtime: 1579.287 ms
(5 rows)
如果我在单词中使用“-”,那么获取结果的时间会非常长:
EXPLAIN ANALYZE SELECT p.id, p.price, p.currency, p.images, p.merchant_id
FROM products AS p
WHERE deleted=false AND to_tsvector('english', p.title || coalesce(p.description, '')) @@ to_tsquery('turquoise-blue:*')
LIMIT 30 OFFSET 0;
结果:
查询计划
Limit (cost=0.00..41120.86 rows=2 width=49) (actual time=31400.164..31400.164 rows=0 loops=1)
-> Seq Scan on products p (cost=0.00..41120.86 rows=2 width=49) (actual time=31400.158..31400.158 rows=0 loops=1)
Filter: ((NOT deleted) AND (to_tsvector('english'::regconfig, ((title)::text || COALESCE(description, ''::text))) @@ to_tsquery('turquoise-blue:*'::text)))
Rows Removed by Filter: 281510
Total runtime: 31400.247 ms
(5 rows)
非常感谢您的想法!谢谢!
编辑:
我认为这与结果数量有关,没有结果的查询会花费更长的时间吗?