Performance

使用 1000 萬行 Postresql 改進選擇表的前 10 行的時間

  • July 2, 2019

我正在處理一個包含 1000 萬行的表,我正在使用此查詢選擇前 10 行或後 10 行:

SELECT * 
FROM category_member 
ORDER BY (p::float8/q) DESC 
LIMIT 10;

我之所以訂購,是(p::float8/q)因為我使用的是使用者指定的以分數為索引的訂單(我有與此連結中相同的表,僅解釋了 1000 萬行)

Limit  (cost=585557.40..585557.43 rows=10 width=24) (actual time=15865.330..15865.332 rows=10 loops=1)
 ->  Sort  (cost=585557.40..610557.40 rows=10000000 width=24) (actual time=15865.327..15865.327 rows=10 loops=1)
       Sort Key: (((p)::double precision / (q)::double precision))
       Sort Method: top-N heapsort  Memory: 25kB"
       ->  Seq Scan on category_member  (cost=0.00..369461.00 rows=10000000 width=24) (actual time=0.070..13528.741 rows=10000000 loops=1)
Planning time: 10.556 ms
Execution time: 15865.540 ms

在我看來,這個查詢需要 16,135 秒才能獲得包含 1000 萬行的表的前 10 行。

任何人都有同樣的問題並且知道如何提高我的查詢性能?

CREATE UNIQUE INDEX ON category_member (category_id, (p::float8/q));

要提高該查詢的速度,您需要以下索引

create index on category_member ((p::float8/q));

引用自:https://dba.stackexchange.com/questions/241863