我在 postgres 8.1 db 中有一张表,其中包含大约 370,000 名客户的信息。此表包括字段 sn(姓)和 gn(名字)。我想让用户使用表单或或简单地搜索客户全名。我第一次尝试构建查询是这样的:
SELECT sn || ', ' || gn as name from users
WHERE sn || ' ' || gn like '%Johnson David%'
or gn || ' ' || sn like '%Johnson David%'
这工作正常,但速度很慢,时钟为 600/623 毫秒。为了优化,我只在 sn 字段上创建了一个索引,因为我猜测 gn 字段会包含太多重复,以至于对索引毫无用处。不幸的是,索引姓氏根本没有提高性能,因为查询没有使用索引。
Seq Scan on users (cost=0.00..18296.06 rows=1 width=64) (actual time=57.935..588.755 rows=8 loops=1)
我的猜测是,原因是这个线程中描述的。我考虑过使用多列索引,但我猜这意味着我只能使用上面提到的两种样式中的一种进行搜索,即或不能同时使用两者。
我也考虑过创建一个全文索引,但它似乎不适合名称值,因为我会得到很多不相关的词干等等。有人对索引策略有什么建议吗?看起来它应该是一个很常见的用例。