2

我在 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)

我的猜测是,原因是这个线程中描述的。我考虑过使用多列索引,但我猜这意味着我只能使用上面提到的两种样式中的一种进行搜索,即或不能同时使用两者。

我也考虑过创建一个全文索引,但它似乎不适合名称值,因为我会得到很多不相关的词干等等。有人对索引策略有什么建议吗?看起来它应该是一个很常见的用例。

4

2 回答 2

4

它不会使用索引,因为您在字符串 '%....' 的开头使用了通配符。这行不通。考虑使用 三元组。或者,您可以使用全文搜索功能。这两种方法都需要更新版本的 Postgres。无论如何你都应该更新。8.1 是石器时代的旧版本,不受支持,更新的版本不仅速度更快,而且还为您提供更多功能来满足您的需求。

于 2013-07-22T10:30:40.607 回答
0

在完整计算表达式上创建索引。这仍然会强制进行索引扫描,但表达式是预先计算的,并且索引比整个表小得多。

于 2013-07-22T10:45:22.913 回答