我有一个airports
表,其中包含近4000个机场的列表。该表具有一个searchable
列和一个ts_vector
索引:airports_searchable_index
列:
searchable tsvector NULL
CREATE INDEX airports_searchable_index ON airports USING gin (searchable)
鉴于我在searchable
列中有一个索引文档,并且尝试对该列运行查询,我在开发机上得到了非常快速的响应(查询大约需要3毫秒),但是在生产环境中大约需要650毫秒(使用完全相同的数据!)。奇怪的是,我的生产机器要比本地开发机器强得多。例如查询:
select * from "airports" where searchable @@ to_tsquery('public.hebrew', 'ltn:*') order by "popularity" desc limit 100
我已经打开PGAdmin并尝试进行一些测试。我所看到的是,我第一次在新的“查询工具面板”中运行以上查询,执行该查询所需的时间为650-800ms。但是,在第二次运行中,即使我更改查询字词,也需要30-60毫秒才能运行。由此得出的结论是,Postgres可以为每个连接打开内存中的文档,并针对该文档运行查询。由于我使用PHP与后端通信,因此每个请求都将打开它自己与数据库的连接,从而导致Postgres不断重新打开文档。
这可能是我的生产服务器上的配置错误吗?
这是一个explain
查询(用于生产服务器):
Limit (cost=24.03..24.04 rows=1 width=8) (actual time=0.048..0.048 rows=1 loops=1)
Output: id, popularity
Buffers: shared hit=4
-> Sort (cost=24.03..24.04 rows=1 width=8) (actual time=0.047..0.047 rows=1 loops=1)
Output: id, popularity
Sort Key: airports.popularity DESC
Sort Method: quicksort Memory: 25kB
Buffers: shared hit=4
-> Bitmap Heap Scan on lametayel.airports (cost=20.01..24.02 rows=1 width=8) (actual time=0.040..0.040 rows=1 loops=1)
Output: id, popularity
Recheck Cond: (airports.searchable @@ '''ltn'':*'::tsquery)
Heap Blocks: exact=1
Buffers: shared hit=4
-> Bitmap Index Scan on airports_searchable_index (cost=0.00..20.01 rows=1 width=0) (actual time=0.036..0.036 rows=1 loops=1)
Index Cond: (airports.searchable @@ '''ltn'':*'::tsquery)
Buffers: shared hit=3
Planning time: 0.304 ms
Execution time: 0.078 ms
这是一个explain
查询(用于开发服务器):
Limit (cost=28.03..28.04 rows=1 width=8) (actual time=0.065..0.067 rows=1 loops=1)
Output: id, popularity
Buffers: shared hit=5
-> Sort (cost=28.03..28.04 rows=1 width=8) (actual time=0.064..0.065 rows=1 loops=1)
Output: id, popularity
Sort Key: airports.popularity DESC
Sort Method: quicksort Memory: 25kB
Buffers: shared hit=5
-> Bitmap Heap Scan on lametayel.airports (cost=24.01..28.02 rows=1 width=8) (actual time=0.046..0.047 rows=1 loops=1)
Output: id, popularity
Recheck Cond: (airports.searchable @@ '''ltn'':*'::tsquery)
Heap Blocks: exact=1
Buffers: shared hit=5
-> Bitmap Index Scan on airports_searchable_index (cost=0.00..24.01 rows=1 width=0) (actual time=0.038..0.038 rows=1 loops=1)
Index Cond: (airports.searchable @@ '''ltn'':*'::tsquery)
Buffers: shared hit=4
Planning time: 0.534 ms
Execution time: 0.122 ms