我需要一些关于如何设计此表的建议,以及在表上设置索引以确保查找速度很快。
我有一个包含用户联系人的表格,如:
users_contact
- id
- email
- home_phone
- cell
用户只需输入以下内容之一:email,home_phone,cell。
我需要查询表格,通过电子邮件,home_phone或单元格查找。
我该如何索引这个表,我想到了3个索引,其中我只有以下索引:
电子邮件不是空的
home_phone不是NULL
cell is NOT NULL
最好是创建另一个列,例如:“lookup_key”,只需将该值存储在此列中,然后有一个类型列,告诉我该值是什么?
有什么建议吗?
答案 0 :(得分:0)
我会尝试第三个选项 - 三个字段合并的索引:
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)