在googled上使用limit/offset时获取总行数

2024-04-20 11:41:36 发布

您现在位置:Python中文网/ 问答频道 /正文

ListingStore.query().filter(ListingStore.account_id==1).fetch(10, offset=40)

上面是一个从我的数据集返回第5页结果的查询。 我的问题是我还必须返回总行数,如下所示:

^{pr2}$

我可以使用count()来获得total,如下所示:

ListingStore.query().filter(ListingStore.account_id==1).count()

但这似乎与fetch()的运行时间一样长,导致整个过程需要两倍的时间。在

有更好的办法吗?在


Tags: 数据id过程count时间accountfetchfilter
2条回答

.count()比等效查询更高效,但只是通过一些常量因子(取决于每个实体与仅键查询相比的最小大小)。在

您可以获得的唯一显著的性能提升是通过反规范化数据模型“冗余地”跟踪每个account_id有多少ListingStore实体。在

为此,您只需引入一个新的实体ListingStoreByAccount,并将account_id作为密钥中的id,这样就可以非常快速地获取它,并引入一个{}w/当前计数。在

在每次创建或删除ListingStore实体时,您需要保持适当的实体更新,如果并发性是一个问题,那么可能在事务中(每个ListingStoreByAccount只使用伪密钥“parent”作为实体组)。在

如果计数器争用成为一个问题,可以使用一个高速切分计数器,例如per https://cloud.google.com/appengine/articles/sharding_counters和示例https://github.com/GoogleCloudPlatform/appengine-sharded-counters-python作为示例代码。在

除非您一直需要每个account_id的计数,否则我会在需要时使用The Memcache Pattern来运行count(),并缓存结果以备后续页面查询。在

然后,正如Alex所提到的,当ListingStore发生变化时,删除相应的缓存条目。在

相关问题 更多 >