Google 计数查询的云数据存储索引

Google Cloud Datastore Indexes for count queries

Google 云数据存储要求需要构建复合索引来查询一种类型的多个字段。以下面的查询为例,

class Greeting(ndb.Model):
    user = ndb.StringProperty()
    place = ndb.StringProperty()

# Query 1
Greeting.query(Greeting.user == 'yash@gmail.com', Greeting.place == 'London').fetch()
# Query 2
Greeting.query(Greeting.user == 'yash@gmail.com', Greeting.place == 'London').count()

我正在使用 python 和 ndb 来访问云数据存储。在上面的示例中,如果 userplace 上没有定义复合索引,查询 1 会引发 NeedIndexError。但是即使 userplace 上没有索引,查询 2 也能正常工作。

我想了解云数据存储在强制使用索引获取实体列表(查询 1)时如何在没有索引的情况下获取计数(查询 2)。我知道它存储每个索引的每个种类的统计信息,这将导致对现有索引计数的更快响应(参考 docs)。但我无法解释上述行为。

注意:查询给定类型的一个 属性 时没有问题,因为默认情况下云数据存储在单个属性上有索引。

没有明确和直接的解释为什么会发生这种情况,但很可能是因为改进的查询规划器如何与 zigzag 索引一起工作。

您可以在此处阅读更多相关信息:https://cloud.google.com/appengine/articles/indexselection#Improved_Query_Planner

count() 工作和 fetch() 背后的逻辑可能不是因为使用 count() 你不需要在内存中保留很多结果。

因此,在 count() 的情况下,您可以通过将工作拆分为多个并行处理的块来轻松扩展,然后将相应的计数合计为一个。你不能用 cursors/recordsets.

便宜地做到这一点