Google App Engine:游标 vs 偏移量

20 投票
1 回答
3826 浏览
提问于 2025-04-16 03:16

你知道从查询中获取结果的最佳方法是什么吗?

1. 游标(Cursor)

q = Person.all()
last_cursor = memcache.get('person_cursor')
if last_cursor:
    q.with_cursor(last_cursor)
people = q.fetch(100)
cursor = q.cursor()
memcache.set('person_cursor', cursor)

2. 偏移量(Offset)

q = Person.all()
offset = memcache.get('offset')
if not offset:
   offset = 0
people = q.fetch(100, offset = offset)
memcache.set('offset', offset + 100)

根据阅读谷歌的文档,游标似乎不会增加查询偏移量的额外负担

1 个回答

31

虽然很难精确测量,但我会感到非常惊讶,如果在返回足够多的Person实体时,游标的表现不比偏移量的方法好。正如文档中非常清楚地说明的,

数据存储会根据偏移量和限制来获取结果。最开始的偏移量结果并不会被数据存储自己跳过。

fetch()方法会跳过最开始的偏移量结果,然后返回剩下的(限制数量的)结果。

查询的性能特点与偏移量加限制的数量是线性相关的。

我不确定还有什么可以更明确的:O(偏移量 + 限制)就是使用偏移量获取数据时的性能表现。如果你总共要获取一百万个项目,每次获取1000个,当你获取最后1000个(偏移量为999000)时,数据存储不会跳过前面的999000个(尽管fetch并不会返回它们),所以性能影响会非常大。

而使用游标就没有这样的限制:获取数据时会准确从上次停止的地方继续,而不需要重复获取之前已经通过游标获取的所有(可能很多)项目。因此,性能为O(限制),耗时应该会比使用偏移量的方式好得多,只要偏移量足够大。

撰写回答