У меня есть таблицаОптимизировать запрос с OFFSET на большом столе
create table big_table (
id serial primary key,
-- other columns here
vote int
);
Эта таблица очень большая, около 70 миллионов строк, мне нужно запросить:
SELECT * FROM big_table
ORDER BY vote [ASC|DESC], id [ASC|DESC]
OFFSET x LIMIT n -- I need this for pagination
Как вы знаете, когда x
это большое количество, такие запросы очень медленные.
Для оптимизации производительности я добавил индексы:
create index vote_order_asc on big_table (vote asc, id asc);
и
create index vote_order_desc on big_table (vote desc, id desc);
EXPLAIN
показывает, что выше SELECT
запросов использует эти индексы, но это очень медленно, в любом случае с большим смещением.
Что можно сделать для оптимизации запросов с помощью OFFSET
в больших таблицах? Может быть, PostgreSQL 9.5 или даже более новые версии имеют некоторые функции? Я искал, но ничего не нашел.
Как часто таблица обновляется? –
очень часто, в среднем: каждые 10, 20 секунд обновляется по крайней мере 1 строка – RIKI
почему бы не привести в порядок разбиение на страницы? http://blog.jooq.org/2013/10/26/faster-sql-paging-with-jooq-using-the-seek-method/ –