具有整数时间戳记的Json数据的理想Postgres索引

问题描述 投票:0回答:1

我使用Amazon Aurora Postgres 10.7在此表中有数百万条记录:

create table "somedb"."sometable"
(
    id varchar(4096) not null constraint "sometable_pkey" primary key,
    tag varchar(255) not null,
    json jsonb not null
);

示例行:

{"id": "abc", "ts": 1580879910, "data": "my stuff"}

我有这些查询需要数十秒:

SELECT jsonData->'data'
WHERE (jsonData->>'ts' >= '1576000473')
ORDER BY jsonData->>'ts' ASC LIMIT 100 OFFSET 50000;

我试图在这里提高性能,这些都是我尝试过的索引,但至多我最多只能在查询计划中获得索引扫描。

create index "sometable_ts"
on "somedb"."sometable" ((jsondata -> 'ts'::text));

create index "sometable_ts-int" 
on "somedb"."sometable" using btree (((jsondata ->> 'ts')::integer));

我也将查询调整为:ORDER BY (jsonData->>'ts')::integer,但什么也没有。

最佳方案:

Limit  (cost=613080.18..613149.46 rows=100 width=356) (actual time=24934.492..24937.344 rows=100 loops=1)
    ->  Index Scan using "sometable_ts-int" on "sometable"  (cost=0.43..3891408.61 rows=5616736 width=356) (actual time=0.068..24889.459 rows=885000 loops=1)
        Index Cond: (((jsondata ->> 'ts'::text))::integer >= 1576000473)
Planning time: 0.145 ms
Execution time: 24937.381 ms

有人可以推荐一种方法来调整索引或查询以使其更快吗?谢谢!

sql postgresql sql-execution-plan query-planner
1个回答
1
投票
[Using OFFSET像这个OFFSET

您应该使用键集分页:

© www.soinside.com 2019 - 2024. All rights reserved.