【问题标题】:In Postgresql how to speed up substring queries在 Postgresql 中如何加快子字符串查询
【发布时间】:2010-09-01 12:15:14
【问题描述】:

我有一个大约 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)
)

查询此表以获取 description 列内容的最常见操作。典型的查询是...

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

这需要 8 到 20 秒才能恢复结果。是否有任何其他方法可以优化可以产生更快结果的表或查询。我在 8.2 Portgresql 上。

【问题讨论】:

    标签: sql performance postgresql


    【解决方案1】:

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

    为了进一步优化,我会为time 创建一个索引并使用它来限制结果。例如

    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 以了解速度提升的演示。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-09-14
        • 1970-01-01
        • 2020-12-19
        • 2017-04-15
        • 2010-09-07
        • 2023-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多