我有一个简单的日志表,大约有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。
答案 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模块。