【问题标题】:How to increase query speed without using full-text search?如何在不使用全文搜索的情况下提高查询速度?
【发布时间】:2011-06-04 14:40:04
【问题描述】:

这是我的简单查询;通过搜索selectnothing,我确定我不会找到任何结果。

SELECT nome_t FROM myTable WHERE nome_t ILIKE '%selectnothing%';

这是EXPLAIN ANALYZE VERBOSE

Seq Scan on myTable  (cost=0.00..15259.04 rows=37 width=29) (actual time=2153.061..2153.061 rows=0 loops=1)
  Output: nome_t
  Filter: (nome_t ~~* '%selectnothing%'::text)
Total runtime: 2153.116 ms

myTable 有大约 350k 行,表定义类似于:

CREATE TABLE myTable (
    nome_t text NOT NULL,
)

我在 nome_t 上有一个索引,如下所述:

CREATE INDEX idx_m_nome_t ON myTable
USING btree (nome_t);

虽然这显然是全文搜索的理想选择,但我想暂时排除该选项。
此查询旨在从 Web 应用程序运行,目前大约需要 2 秒,这显然太多了;
我可以做些什么,例如使用其他索引方法,以提高此查询的速度?

【问题讨论】:

    标签: sql performance optimization postgresql


    【解决方案1】:

    不,ILIKE '%selectnothing%' 总是需要全表扫描,每个索引都是无用的。你需要全文搜索,实现起来并不难。


    编辑:你可以使用 Wildspeed,我忘记了这个选项。索引会很大,但你的性能也会好很多。

    Wildspeed 扩展提供 GIN 索引 支持 LIKE 的通配符搜索 运算符。

    http://www.sai.msu.su/~megera/wiki/wildspeed

    【讨论】:

    • @Frank Heikens,努力与否不是重点,您能否详细说明为什么'%selectnothing%' 总是需要全表扫描,尽管该字段已被索引?不过,如果不使用全文搜索,哪一个是获得相同结果的最佳选择?
    • 最好的可能是全索引扫描。但如果表只有一列,这通常不是一个好处;)为什么? use-the-index-luke.com/sql/where-clause/searching-for-ranges/…
    • @Markus Winand,我确实知道使用通配符作为前缀,但搜索 'selectnothing%' 所花费的时间与 'selectnothing' 所花费的时间相同......也许我在这里遗漏了一些明显的东西......
    • 检查 Wildspeed 以提高 LIKE 的性能。普通的 btree 索引是排序的,LIKE '%var%' 不知道从哪里开始搜索,它必须检查所有内容:顺序扫描将是最好的选择。
    • @Frank Heikens,谢谢,这是有用的信息! :)
    【解决方案2】:

    您可以做的另一件事- 将表 myTable 中的这个 nome_t 列拆分为它自己的表。从表中搜索一列很慢(如果有 50 个其他宽列),因为其他数据有效地减慢了对该列的扫描(因为每页/范围内的记录较少)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多