对在Python应用程序引擎上使用数据存储进行分页感到困惑吗

对在Python应用程序引擎上使用数据存储进行分页感到困惑吗,python,google-app-engine,pagination,google-cloud-datastore,Python,Google App Engine,Pagination,Google Cloud Datastore,我正在构建一个Webapp2应用程序,并试图找到分页的最佳解决方案。 我发现流行的方法是使用光标。例如: # My solution is to get all cursors in the very first time # For example, there will be 2 cursors for 3 pages # page1|c1|page2|c2|page3 page_size = 20 all = model.MyModel.gql(...) ... if cursor:

我正在构建一个Webapp2应用程序,并试图找到分页的最佳解决方案。 我发现流行的方法是使用光标。例如:

# My solution is to get all cursors in the very first time
# For example, there will be 2 cursors for 3 pages 
# page1|c1|page2|c2|page3

page_size = 20
all = model.MyModel.gql(...)
...
if cursor:
   # Use cursor to get items
   list = all.with_curosr(...)
else:
   # Get all cursors and memcaching all cursors
   ...
我也尝试了另一个解决方案,虽然我知道很多人会认为这是个坏的解决方案:

# In this solution, I try to split query into many list
# page1(list1)|page2(list2)|page3(list3)

page_size = 20
all = list(model.MyModel.gql(...))
lists = [all[i:i+page_size] for i in range(0, len(all), page_size)]

# Client will send the page number to server side
list = []
if len(lists) > 0:
    list = lists[int(page_number)-1]
我的问题来了! 使用游标的优点是什么

两个解决方案都需要执行MyModel.gql(…)来获取数据,而第一个解决方案仍然需要使用鼠标(…)
来执行来检索项目。 这让我很困惑


如果您有更好的解决方案或任何改进我的解决方案的建议,请与我分享!非常感谢你

使用光标与使用页面有很大的区别。使用游标时,获取下一个游标结果非常有效:最多O(1)或O(logn)

使用分页时,需要将整个数据存储查询结果扫描到您请求的页面:每个页面请求O(n)

因此,像使用游标迭代所有页面这样的简单操作最多是O(n logn),而使用页面则是O(n^2)。这不仅需要更多的时间,还需要更多的数据存储读取,因为在谷歌内部,它仍然会读取到请求页面的所有条目,然后过滤掉它们

因此,它还将在数据存储读取方面产生更多的成本,并且如果您有许多请求,并且更有可能启动另一个实例,那么它还将产生更多的实例时间


请参阅有关这方面的官方文档:

使用光标与使用页面有很大的区别。使用游标时,获取下一个游标结果非常有效:最多O(1)或O(logn)

使用分页时,需要将整个数据存储查询结果扫描到您请求的页面:每个页面请求O(n)

因此,像使用游标迭代所有页面这样的简单操作最多是O(n logn),而使用页面则是O(n^2)。这不仅需要更多的时间,还需要更多的数据存储读取,因为在谷歌内部,它仍然会读取到请求页面的所有条目,然后过滤掉它们

因此,它还将在数据存储读取方面产生更多的成本,并且如果您有许多请求,并且更有可能启动另一个实例,那么它还将产生更多的实例时间


请参阅有关这方面的官方文档:

使用光标与使用页面有很大的区别。使用游标时,获取下一个游标结果非常有效:最多O(1)或O(logn)

使用分页时,需要将整个数据存储查询结果扫描到您请求的页面:每个页面请求O(n)

因此,像使用游标迭代所有页面这样的简单操作最多是O(n logn),而使用页面则是O(n^2)。这不仅需要更多的时间,还需要更多的数据存储读取,因为在谷歌内部,它仍然会读取到请求页面的所有条目,然后过滤掉它们

因此,它还将在数据存储读取方面产生更多的成本,并且如果您有许多请求,并且更有可能启动另一个实例,那么它还将产生更多的实例时间


请参阅有关这方面的官方文档:

使用光标与使用页面有很大的区别。使用游标时,获取下一个游标结果非常有效:最多O(1)或O(logn)

使用分页时,需要将整个数据存储查询结果扫描到您请求的页面:每个页面请求O(n)

因此,像使用游标迭代所有页面这样的简单操作最多是O(n logn),而使用页面则是O(n^2)。这不仅需要更多的时间,还需要更多的数据存储读取,因为在谷歌内部,它仍然会读取到请求页面的所有条目,然后过滤掉它们

因此,它还将在数据存储读取方面产生更多的成本,并且如果您有许多请求,并且更有可能启动另一个实例,那么它还将产生更多的实例时间


请参阅有关这方面的官方文档:

感谢您的精心设计。现在我意识到使用游标可以比使用偏移量减少读取操作。多亏了您的精心设计。现在我意识到使用游标可以比使用偏移量减少读取操作。多亏了您的精心设计。现在我意识到使用游标可以比使用偏移量减少读取操作。多亏了您的精心设计。现在我意识到使用游标可以比使用偏移量减少读取操作。