在Postgresql中如何加快子串查询

时间:2010-09-01 12:15:14

标签: sql performance postgresql

我有一个简单的日志表,大约有500,000行,表结构是

 TABLE logs
(
  id serial NOT NULL,
  username character varying(32),
  user_id integer,
  description text NOT NULL,
  "time" timestamp with time zone DEFAULT now(),
  referrer character varying(128),
  "type" character varying(25)
)

在查询此表格中描述列内容方面最常见的操作。典型的查询是......

SELECT username , time , description FROM logs WHERE description ~* 'some text'  ORDER by time DESC

这需要8到20秒,以带回结果。是否有任何其他方法来优化表或查询,以产生更快的结果。我在8.2 Portgresql。

2 个答案:

答案 0 :(得分:3)

首先,您应该升级到8.4以获得所有新的性能优势。 8.4集成了full text searching的tsearch。如果无法升级,请从contrib。

安装Tsearch2

为了进一步优化,我将为time创建一个索引并使用它来限制结果。 E.g。

SELECT username , time , description FROM logs WHERE 
    to_tsvector('english', description) @@ to_tsquery('english', 'some text')
    AND time > current_timestamp - INTERVAL '1 day'
    ORDER by time DESC

有关详细信息,请参阅链接的文档。您需要为to_tsvector创建索引,否则全文搜索将毫无用处。

编辑:如果您的表包含数百万个元组的数据,请考虑使用8.2中提供的partitioning重新创建整个表。要提高原始速度,请切换到SSD磁盘。有关提高速度的说明,请参见this article

答案 1 :(得分:1)

您可以创建一个列(布尔值),该列在插入和更新时设置。一个触发器,这将是可搜索的,但搜索条件将始终是相同的。

您是否考虑过使用Full-text search?您必须在您的postgres版本中手动安装FTS模块。