首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优化此全文搜索查询?(tsvector) (1.5mil行)

如何优化此全文搜索查询?(tsvector) (1.5mil行)
EN

Stack Overflow用户
提问于 2011-11-30 15:31:33
回答 1查看 722关注 0票数 3

我目前在PostgreSQL中有一个全文搜索查询(见下文),它扫描包含150万行的单个表,查找与“所有”术语和“任何”术语匹配的所有条目。

对于结果很少的查询,查询可以正确执行,并且执行速度一般(~2-3秒)。在100,000+匹配的结果上以可怕的速度(大约15-100秒)

查询首先按术语类型对结果进行排序(先是所有匹配的术语,然后是匹配的任何术语),然后通过ts_rank_cd相关性计算对结果进行子排序。(以及更简单的变体,它按可索引的已知列进行排序,如持续时间)

代码语言:javascript
复制
SELECT
  *,
  ts_rank_cd(textsearchable, query_any_terms) AS relevance,
  textsearchable @@ query_all_terms AS all_terms,
  sum(1) over (PARTITION BY textsearchable @@ query_all_terms) AS match_method_total,
  sum(1) over () AS all_matched_total
FROM
  videos,
  to_tsquery(?) AS query_any_terms,
  to_tsquery(?) AS query_all_terms
WHERE
  website IN (?)
  AND textsearchable @@ query_any_terms
  AND duration_in_seconds >= ?
  AND duration_in_seconds <= ?
ORDER BY
  all_terms DESC, 
  relevance DESC 
LIMIT ? 
OFFSET ?

所有相关列都已编入索引,系统监控显示内存和cpu未得到最充分利用,瓶颈似乎是磁盘IO。

服务器是Ubuntu server 10.04。内存和cpu能力可以根据需要通过后台轻松增加,以满足解决方案。

目前,数据库在生产中是静态的,不会在生产服务器上写入数据库。因此,如果这是有益的,则完全和准确地生成保持准确的索引是可能的。

任何对寻找改进途径的帮助都将不胜感激。如有需要,可及时提供附加信息。

EN

回答 1

Stack Overflow用户

发布于 2011-12-01 16:29:54

使用tmpfs将DB加载到ram中,查询时间显著改善(即从大约100秒到大约20秒)。

请参阅:http://www.slideshare.net/pgconf/five-steps-perform2009

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8322517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档