假设我在 PostgreSQL 中有一个
user
表,其中包含列
first_name (PK)
last_name (PK)
email
目前已有数百万用户。一名用户有该记录
(John, Smith, [email protected])
现在搜索他,输入错误
Johny Smit
。
我怎样才能快速找到记录? sqlalchemy 也可以吗?
您可以使用 pg_trgm
扩展中包含的基于
trigram的索引和搜索:demo
create extension pg_trgm;
create index trgm_idx on my_table using GiST ( first_name gist_trgm_ops
,last_name gist_trgm_ops);
select * from my_table
where first_name % 'Johny'
and last_name % 'Smit'
order by first_name<->'Johny'
,last_name <->'Smit'
limit 5;
名字 | 姓氏 | 电子邮件 |
---|---|---|
约翰 | 史密斯 | [电子邮件受保护] |
查询计划 |
---|
限制(成本=0.28..8.31行=1宽度=119)(实际时间=19.341..19.353行=1循环=1) |
输出:名字、姓氏、电子邮件、((名字 <-> 'Johny'::text)), ((姓氏 <-> 'Smit'::text)) |
-> 在 public.my_table 上使用 trgm_idx 进行索引扫描(成本=0.28..8.31行=1宽度=119)(实际时间=19.337..19.348行=1循环=1) |
输出:名字,姓氏,电子邮件,(名字<->'Johny'::text),(姓氏<->'Smit'::text) |
索引条件:((my_table.first_name % 'Johny'::text) AND (my_table.last_name % 'Smit'::text)) |
订购依据:((my_table.first_name <-> 'Johny'::text) AND (my_table.last_name <-> 'Smit'::text)) |
规划时间:1.364毫秒 |
执行时间:19.416 ms |
John Smith
埋在一堆 100k 随机 uuid
下。