我會嘗試第三選項 - 指數三個字段的聚結:
t=# create table users_contact (id bigint, email text, phone text, cell text);
CREATE TABLE
t=# insert into users_contact (email) select '1';
INSERT 0 1
t=# insert into users_contact (email) select '2';
INSERT 0 1
t=# insert into users_contact (cell) select '3';
INSERT 0 1
t=# create index i1 on users_contact (coalesce(email,phone,cell));
CREATE INDEX
t=# with a as (select generate_series(1,10000,1) g) insert into users_contact(phone) select g from a;
INSERT 0 10000
t=# explain select * from users_contact where coalesce(email,phone,cell) = '1';
QUERY PLAN
--------------------------------------------------------------------------
Index Scan using i1 on users_contact (cost=0.27..8.29 rows=1 width=104)
Index Cond: (COALESCE(email, phone, cell) = '1'::text)
(2 rows)
t=# explain select * from users_contact where cell = '1';
QUERY PLAN
----------------------------------------------------------------
Seq Scan on users_contact (cost=0.00..46.69 rows=1 width=104)
Filter: (cell = '1'::text)
(2 rows)
我會去第三種選擇 - 基於函數的索引,而不是 - 如果你用在當你選擇索引將被消耗相同。 –
添加另一列,它是由BEFORE INSERT和BEFORE UPDATE觸發器填充的電子郵件,home_phone和單元格的連接。索引它,需要NOT NULL並用於查找。 – iTollu
@iTollu我討厭觸發器:) – Blankman