用于计数查询的Google Cloud Datastore索引

时间:2018-07-27 10:13:51

标签: python google-cloud-datastore app-engine-ndb

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一起使用以访问云数据存储。在上面的示例中,如果在NeedIndexErroruser上没有定义复合索引,则查询1会引发place。但是,即使userplace上没有索引,查询2仍然可以正常工作。

我想了解云数据存储如何在授权索引以获取实体列表(查询1)时不使用索引来获取计数(查询2)。我了解它按索引存储每种类型的统计信息,这将导致对现有索引计数的更快响应(请参阅docs)。但是我无法解释上述行为。

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

1 个答案:

答案 0 :(得分:1)

目前尚无明确直接的原因说明,但很可能是因为改进的查询计划程序如何与zigzag索引一起使用。

您可以在此处了解更多信息:https://cloud.google.com/appengine/articles/indexselection#Improved_Query_Planner

count()fetch()起作用的逻辑不可能是因为count()不需要在内存中保存很多结果。

因此,在count()的情况下,您可以通过将工作拆分为多个并行处理的块,然后将相应的计数加起来为1来轻松扩展。使用游标/记录集不能便宜地做到这一点。