6

我有一个带有许多测试字段的查询,如下所示:

SELECT * FROM some-table
  WHERE field1 ILIKE "%thing%"
     OR field2 ILIKE "%thing"
     OR field3 ILIKE "%thing";

这些列几乎都是 varchar(50) 左右。现在我明白为了提高性能,我应该索引搜索操作的字段。我应该考虑完全用 TSEARCH 替换 ILIKE 吗?

4

3 回答 3

15

全文搜索设置与“包含”之类的查询不同。它包含单词等,因此您可以将“汽车”与“汽车”相匹配。

如果你真的想要一个快速的 ILIKE,那么没有标准的数据库索引或 FTS 会有所帮助。幸运的是,pg_trgm 模块可以做到这一点。

于 2012-08-26T07:16:33.823 回答
5

非常重要的一件事:没有 B-TREE INDEX会改进这种搜索:

where field ilike '%SOMETHING%'

我的意思是,如果您执行以下操作:

create index idx_name on some_table(field);

您将改进的唯一访问是where field like 'something%'. (当您搜索以某些文字开头的值时)。field因此,在这种情况下,向列添加常规索引不会有任何好处。

如果您需要提高搜索响应时间,请务必考虑使用FULL TEXT SEARCH

于 2012-08-26T00:05:02.933 回答
3

补充一点其他人所说的。

首先,您不能真正使用基于字符串中间值的索引。索引通常是树搜索,您无法知道您的搜索是否会比仅扫描表更快,因此 PostgreSQL 将默认为 seq 扫描。只有与字符串的第一部分匹配时才会使用索引。所以:

SELECT * FROM invoice
  WHERE invoice_number like 'INV-2012-435%'

可以使用索引但like '%44354456%'不能。

一般来说,在 LedgerSMB 中,我们会同时使用这两种方法,具体取决于我们正在执行的搜索类型。您可能会看到如下搜索:

select * from parts
  WHERE partnumber ilike ?  || '%'
    and plainto_tsquery(get_default_language(), ?) @@ description;

所以这些是非常不同的。在最有意义的地方使用每一个。

于 2012-08-26T13:41:10.790 回答