Kendric Folkin, а почему именно за одну? Скажем, для веб-страницы одна секунда - это очень много. Запросы должны отрабатывать в идеале за сотые доли секунды.
Но в целом, как я понимаю, у вас чисто умозрительные проблемы?
Kendric Folkin, почитайте про индексы. В индексе ссылки на записи уже отсортированы, достаточно выбрать первые три записи по этому индексу. Это будет работать за миллисекунды независимо от размера базы. От размера базы будет зависеть скорость вставки в такую большую таблицу. При этом сложность вычисления индекса будет логарифмической, то есть log(2e6), а это примерно 20~21 шаг для бинарного поиска по индексу размером в 2 ляма. Тоже быстро.
Так что получение топ N элементов при наличии нужного индекса будет очень эффективной операцией. Указание сортировки по индексированным полям в SQL-запросе всего лишь указывает порядок обхода таблицы. Её не придётся перебирать всю.
d1=# create table t(id int not null generated always as identity, val text);
CREATE TABLE
d1=# insert into t (val) select md5(x::text) from generate_series(1, 2000000) x;
INSERT 0 2000000
d1=# create index ix_t_id on t (id);
CREATE INDEX
d1=# create index ix_t_val on t (val);
CREATE INDEX
d1=# analyze t;
ANALYZE
d1=# explain analyze select * from t order by id desc limit 3;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.43..0.53 rows=3 width=37) (actual time=1.948..1.952 rows=3 loops=1)
-> Index Scan Backward using ix_t_id on t (cost=0.43..68618.43 rows=2000000 width=37) (actual time=1.946..1.949 rows=3 loops=1)
Planning Time: 1.820 ms
Execution Time: 2.121 ms
(4 rows)
d1=# explain analyze select * from t order by val desc limit 3;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.55..0.78 rows=3 width=37) (actual time=1.492..1.500 rows=3 loops=1)
-> Index Scan Backward using ix_t_val on t (cost=0.55..154347.15 rows=2000000 width=37) (actual time=1.489..1.496 rows=3 loops=1)
Planning Time: 0.183 ms
Execution Time: 1.530 ms
(4 rows)