我有带有列的表tbl
-数据TEXT
-fk_id BIGINT
-文字TEXT
有超过1亿条记录,并且fk_id的〜1K个不同值。 我需要像这样运行查询
SELECT * FROM tbl WHERE fk_id=12345 AND text LIKE '%abcdef%
我尝试将扩展名GIN
与btree_gin
和gin_trgm_ops
一起使用
CREATE EXTENSION pg_trgm;
CREATE EXTENSION btree_gin;
CREATE INDEX on tbl USING GIN (fk_id, text gin_trgm_ops)
但是查询分析器会忽略查询的列fk_id
explain select * from tbl where fk_id = 12345 and text like '%abcdef%' limit 10;
Limit (cost=28.00..32.02 rows=1 width=90)
-> Bitmap Heap Scan on tbl (cost=28.00..32.02 rows=1 width=90)
Recheck Cond: (text ~~ '%abcdef%'::text)
Filter: (fk_id = 12345)
-> Bitmap Index Scan on table_fk_id_text_idx (cost=0.00..28.00 rows=1 width=0)
Index Cond: (text ~~ '%abcdef%'::text)
但是,如果我对列fk_id使用INT类型而不是BIGINT,则索引将按预期工作
tbl
-数据TEXT
-fk_id INT
-文字TEXT
explain select * from tbl where fk_id = 12345 and text like '%abcdef%' limit 10;
Limit (cost=36.00..40.02 rows=1 width=90)
-> Bitmap Heap Scan on tbl (cost=36.00..40.02 rows=1 width=90)
Recheck Cond: ((fk_id = 12345) AND (text ~~ '%abcdef%'::text))
-> Bitmap Index Scan on tbl_fk_id_text_idx (cost=0.00..36.00 rows=1 width=0)
Index Cond: ((fk_id = 12345) AND (text ~~ '%abcdef%'::text))
因此,我可以将GIN与INT一起使用,但不能将GIN与BIGINT一起使用。为什么我不能将BIGINT列用于GIN索引? Documentation说,btree_gin与int4(INT)和int8(BIGINT)一起使用。 也许还有另一种方法可以解决这个问题?