我有一张这样的表:
CREATE TABLE products (
id serial PRIMARY KEY,
category_ids integer[],
published boolean NOT NULL,
score integer NOT NULL,
title varchar NOT NULL);
Run Code Online (Sandbox Code Playgroud)
一个产品可以属于多个类别。category_ids
列包含所有产品类别的 id 列表。
典型的查询看起来像这样(总是搜索单个类别):
SELECT * FROM products WHERE published
AND category_ids @> ARRAY[23465]
ORDER BY score DESC, title
LIMIT 20 OFFSET 8000;
Run Code Online (Sandbox Code Playgroud)
为了加快速度,我使用以下索引:
CREATE INDEX idx_test1 ON products
USING GIN (category_ids gin__int_ops) WHERE published;
Run Code Online (Sandbox Code Playgroud)
除非某一类别中的产品太多,否则这会很有帮助。它会快速过滤掉属于该类别的产品,但随后必须以艰难的方式完成排序操作(没有索引)。
已安装的btree_gin
扩展允许我像这样构建多列 GIN 索引:
CREATE INDEX idx_test2 ON products USING GIN (
category_ids gin__int_ops, score, title) WHERE published; …
Run Code Online (Sandbox Code Playgroud)