PostgreSQL 多列索引,包括文本和文本数组列

问题描述 投票:0回答:1

我有一个包含电子邮件数据的表。

from
列是文本(字符不同)。

to
列和
cc
列都是文本数组(也是字符变化的)。

将使用整个电子邮件地址值来搜索这些内容(无“喜欢”类型搜索)。我需要返回任何地址与提供的地址匹配的所有行。

我可以添加包含所有 3 列的索引吗?操作符类应该是什么?

目前我已经尝试使用 GIN 和 GiST 索引方法,但找不到与这些方法一起使用的运算符类!

postgresql indexing
1个回答
0
投票

你可以这样做:

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[])
© www.soinside.com 2019 - 2024. All rights reserved.