全文搜索查询在第一次查询时很慢

时间:2019-06-17 03:35:05

标签: sql postgresql full-text-search

我有一个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

0 个答案:

没有答案