我们在表中添加了两个 pg_trgm 索引,以通过电子邮件地址或姓名启用模糊搜索,因为我们需要按姓名或注册期间拼写错误的电子邮件地址(例如“@gmail.con”)查找用户。ANALYZE
在索引创建后运行。
但是,在绝大多数情况下,对这些指数中的任何一个进行排名搜索都非常缓慢。即随着超时的增加,查询可能会在 60 秒内返回,在极少数情况下会快到 15 秒,但通常查询会超时。
pg_trgm.similarity_threshold
是 的默认值0.3
,但将其提高到0.8
似乎并没有什么不同。
这个特定的表有超过 2500 万行,并且不断被查询、更新和插入(每个的平均时间低于 2 毫秒)。设置是 PostgreSQL 9.6.6,运行在具有通用 SSD 存储和或多或少默认参数的 RDS db.m4.large 实例上。pg_trgm 扩展是 1.3 版。
SELECT *
FROM users
WHERE email % 'chris@example.com'
ORDER BY email <-> 'chris@example.com' LIMIT 10;
Run Code Online (Sandbox Code Playgroud)SELECT *
FROM users
WHERE (first_name || ' ' || last_name) % 'chris orr'
ORDER BY (first_name || ' ' || last_name) <-> 'chris orr' LIMIT 10;
Run Code Online (Sandbox Code Playgroud)这些查询不需要经常运行(一天几十次),但它们应该基于当前的表状态,并且最好在 10 秒左右返回。 …