私は製品を備えた非常に大きなテーブルを持っています。非常に高いオフセットでいくつかの製品を選択する必要があります (下の例)。インデックスとパフォーマンスに関する Postgresql のマニュアルでは、ORDER BY + 最終条件で使用される列にインデックスを作成することを提案しています。すべてがピーチで、ソートは使用されていません。ただし、オフセット値が大きい場合、LIMIT は非常にコストがかかります。誰がその原因が考えられるか知っていますか?
次のクエリは数分間実行できます。
Indexes:
"product_slugs_pkey" PRIMARY KEY, btree (id)
"index_for_listing_by_default_active" btree (priority DESC, name, active)
"index_for_listing_by_name_active" btree (name, active)
"index_for_listing_by_price_active" btree (master_price, active)
"product_slugs_product_id" btree (product_id)
EXPLAIN SELECT * FROM "product_slugs" WHERE ("product_slugs"."active" = 1) ORDER BY product_slugs.name ASC LIMIT 10 OFFSET 14859;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
Limit (cost=26571.55..26589.43 rows=10 width=1433)
-> Index Scan using index_for_listing_by_name_active on product_slugs (cost=0.00..290770.61 rows=162601 width=1433)
Index Cond: (active = 1)
(3 rows)