索引数组列以允许选择包含值的行的最有效方法

Most efficient way to index an array column to allow for selecting rows containing a value

假设我有一个 table 这样的:

create table mytable (
   mycol text[]
)

我想 select mycol 包含 "hello" 的所有行。我可以想到两种方法来做到这一点:

SELECT * FROM mytable WHERE 'hello'=any(mycol);
--or
SELECT * FROM mytable WHERE mycol && '{hello}';

我知道对于第二个选项我可以使用 GIN 索引(允许数组选项),而且我很确定对于第一个选项我会使用 BTREE(或者可能是 HASH?)。

所以我的问题是:如果我只需要检查单个项目的成员资格,对于具有数百万行的 table,哪种方法和什么索引最有效?

第二个,有GIN索引。

第一个不能有效地使用 btree 或哈希索引。它可以使用 btree 索引,但只能作为 table.

的精简副本

您可能会将此与相反的情况混淆,在这种情况下,列在 ANY 之前(并且是标量),而文字在 ANY 内部。这个可以使用btree。

SELECT * FROM mytable_scalar WHERE mycol =any('{hello,goodbye}');

了解某事的效率的一个好方法通常是使用虚假数据进行尝试,但大小要模糊逼真:

insert into mytable select ARRAY[md5(random()::text),md5(random()::text)] from generate_series(1,1500000);