ListingStore.query().filter(ListingStore.account_id==1).fetch(10, offset=40)
以上是从我的数据集返回第5页结果的查询。 我的问题是我必须返回总行数,如下所示:
{
"data": ...,
"limit": 10,
"offset": 40,
"total": 1235
}
我可以使用count()
获取total
,如下所示:
ListingStore.query().filter(ListingStore.account_id==1).count()
但这似乎只需要运行fetch(),导致整个事情需要两倍的时间。
有更好的方法吗?
答案 0 :(得分:4)
.count()
比等效查询更有效,但只有一些常数因素(取决于每个实体的大小 - 与仅使用密钥的查询相比最低)。
您可以获得的唯一显着的性能加速是非正规化您的数据模型到#34;冗余"跟踪每个ListingStore
的实体数量account_id
。
出于此目的,您可以引入一个新的实体ListingStoreByAccount
,其中account_id
作为密钥中的ID,因此可以非常快速地获取,IntegerProperty
w /目前的数量。
您可能需要在每次创建或删除ListingStore
实体时更新相应的实体,可能是在一次交易中(使用假的仅限密钥"父级" per { {1}}作为实体组)如果并发是另外一个问题。
如果反竞争成为问题,请转而使用高速分片计数器,例如https://cloud.google.com/appengine/articles/sharding_counters和示例代码https://github.com/GoogleCloudPlatform/appengine-sharded-counters-python。
答案 1 :(得分:1)
除非您始终需要每account_id
个计数,否则我会在需要时使用The Memcache Pattern运行count()
,并为后续页面查询缓存结果。
然后,正如Alex提到的那样,在ListingStore
更改时删除相应的缓存条目。