分析查询postgres

analyze a query postgres

我在下面有一个查询,请问我需要做些什么才能将执行时间从 18 秒减少

查询

SELECT DISTINCT ON (player_name) server_name, player_anme, logged_at, joined_at 
FROM player_cache 
WHERE server_name ILIKE '{query[0]}' 
AND logged_at > (now() - interval '{history} hour') 
ORDER BY player_name,logged_at desc;

执行计划

Unique (cost=14326.21..14326.25 rows=7 width=82) (actual time=18907.017..18907.049 rows=32 loops=1)
  -> Sort (cost=14326.21..14326.23 rows=7 width=82) (actual time=18907.015..18907.023 rows=81 loops=1)
    Sort Key: player_name, logged_at DESC
    Sort Method: quicksort Memory: 36kB
  -> Index Scan using idx_logged_at on player_cache (cost=0.56..14326.11 rows=7 width=82) (actual time=5.605..18906.463 rows=81 loops=1)
    Index Cond: (logged_at > (now() - '30:00:00'::interval))
    Filter: ((server_name)::text ~~* 'Server-1'::text)
    Rows Removed by Filter: 79825
Planning Time: 0.665 ms
Execution Time: 18907.108 ms

您可以创建一个 trigram index 来加速 ILIKE 条件:

CREATE EXTENSION IF NOT EXISTS pg_trgm;

CREATE INDEX ON player_cache USING gin (server_name gin_trgm_ops);