ListingStore.query().filter(ListingStore.account_id==1).fetch(10, offset=40)
上面是一个从我的数据集返回第5页结果的查询。 我的问题是我还必须返回总行数,如下所示:
^{pr2}$我可以使用count()
来获得total
,如下所示:
ListingStore.query().filter(ListingStore.account_id==1).count()
但这似乎与fetch()的运行时间一样长,导致整个过程需要两倍的时间。在
有更好的办法吗?在
.count()
比等效查询更高效,但只是通过一些常量因子(取决于每个实体与仅键查询相比的最小大小)。在您可以获得的唯一显著的性能提升是通过反规范化数据模型“冗余地”跟踪每个
account_id
有多少ListingStore
实体。在为此,您只需引入一个新的实体}w/当前计数。在
ListingStoreByAccount
,并将account_id
作为密钥中的id,这样就可以非常快速地获取它,并引入一个{在每次创建或删除
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
发生变化时,删除相应的缓存条目。在相关问题 更多 >
编程相关推荐