我有一个包含电子邮件数据的表。
from
列是文本(字符不同)。
to
列和cc
列都是文本数组(也是字符变化的)。
将使用整个电子邮件地址值来搜索这些内容(无“喜欢”类型搜索)。我需要返回任何地址与提供的地址匹配的所有行。
我可以添加包含所有 3 列的索引吗?操作符类应该是什么?
目前我已经尝试使用 GIN 和 GiST 索引方法,但找不到与这些方法一起使用的运算符类!
你可以这样做:
CREATE TABLE email (
"from" text NOT NULL,
"to" text[] NOT NULL,
cc text[]
);
CREATE EXTENSION IF NOT EXISTS btree_gin;
CREATE INDEX ON email USING gin ("from", "to", cc);
SET enable_seqscan = off;
EXPLAIN (COSTS OFF) SELECT * FROM email
WHERE "from" = 'mail'
OR "to" @> ARRAY['mail']
OR cc @> ARRAY['mail'];
QUERY PLAN
═════════════════════════════════════════════════════════════════════════════════════════════════════
Bitmap Heap Scan on email
Recheck Cond: (("from" = 'mail'::text) OR ("to" @> '{mail}'::text[]) OR (cc @> '{mail}'::text[]))
-> BitmapOr
-> Bitmap Index Scan on email_from_to_cc_idx
Index Cond: ("from" = 'mail'::text)
-> Bitmap Index Scan on email_from_to_cc_idx
Index Cond: ("to" @> '{mail}'::text[])
-> Bitmap Index Scan on email_from_to_cc_idx
Index Cond: (cc @> '{mail}'::text[])