您知道从查询中获取结果块的最佳方法是什么?
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)
q = Person.all()
offset = memcache.get('offset')
if not offset:
offset = 0
people = q.fetch(100, offset = offset)
memcache.set('offset', offset + 100)
阅读Google documentation,似乎Cursor不会添加查询偏移的开销。
答案 0 :(得分:31)
虽然很难精确可靠地进行测量,但是如果光标没有在偏移方法周围运行时很快就会感到惊讶,因为足够大的Person实体集将被返回。正如the docs非常清楚明确地说,
数据存储区提取偏移量+限制 结果给应用程序。首先 不会跳过偏移结果 数据存储本身。
fetch()方法跳过第一个 偏移结果,然后返回其余部分 (限制结果)。
查询具有性能 对应的特征 线性地与偏移量加上 限制。
我不确定它是如何更明确的: O(偏移+限制)是使用偏移量获取的大O性能。如果整体(比如说多个计划任务)你拿取一百万个项目,一次1000个,当你获取最后1000个项目(偏移999000)时,数据存储不跳过第一个999000(甚至虽然fetch不会返回它们,但性能影响将是惊人的。
没有这样的警告适用于使用游标:从正确的位置获取恢复,而不必重复获取先前查询中已沿该游标提取的所有(可能很多)项目。因此,对于性能 O(限制),只要该偏移量足够大,经过的时间应该比使用偏移量获得的时间任意更好。