我拥有的是一个非常简单的数据库,用于存储来自 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