小编Har*_*rry的帖子

使用 GiST 索引的 Postgres LIKE 查询与完整扫描一样慢

我拥有的是一个非常简单的数据库,用于存储来自 UNC 共享的文件的路径、扩展名和名称。为了测试,我插入了大约 1.5 个 mio 行,下面的查询使用了 GiST 索引,但仍然需要 5 秒才能返回。预计将是几(如 100)毫秒。

EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM residentfiles  WHERE  parentpath LIKE 'somevalue' 
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

当使用%%在查询中,它需要的并不长,采用顺序扫描的,即使(?!)

EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM residentfiles  WHERE  parentpath LIKE '%a%' 
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我对name(filename) 列也有相同的设置,在对该列执行类似查询时,它只需要一半的时间,即使使用%%

EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM residentfiles  WHERE  name LIKE '%a%' 
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我已经尝试过的东西不能用简短的语言写在这里。无论我做什么,它都会从大约 1 mio 行开始变慢。由于基本上从不删除任何内容,因此当然清空和重新索引根本无济于事。除了LIKE %%GIN 或 GiST 索引,我真的不能使用任何其他类型的搜索,因为我需要能够在感兴趣的列中找到任何字符,而不仅仅是“特定人类语言的单词”。

我是否期望这应该在大约 100 毫秒内工作,即使是错误的多百万行?

更多信息

数据库创建脚本

重试,没有任何文本或其他索引,1.7 mio 唯一条目

EXPLAIN ANALYZE select * from residentfiles where name …
Run Code Online (Sandbox Code Playgroud)

postgresql performance gist-index postgresql-9.5 query-performance

4
推荐指数
1
解决办法
2085
查看次数