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 来访问云数据存储。在上面的示例中,如果 user
和 place
上没有定义复合索引,查询 1 会引发 NeedIndexError
。但即使 user
和 place
上没有索引,查询 2 也能正常工作。
我想了解当云数据存储强制使用索引来获取实体列表(查询 1)时,它如何在没有索引的情况下获取计数(查询 2)。据我所知,它存储每个索引的每种统计信息,这将导致对现有索引计数的更快响应(请参阅 docs )。但我无法解释上述行为。
注意:查询给定类型的一个属性时不会出现问题,因为默认情况下云数据存储对单个属性有索引。
最佳答案
对于为什么会发生这种情况,没有明确和直接的解释,但很可能是因为改进的查询规划器如何与 zigzag
索引配合使用。
您可以在这里阅读更多相关信息:https://cloud.google.com/appengine/articles/indexselection#Improved_Query_Planner
count()
工作和 fetch()
背后的逻辑可能不会,因为使用 count()
你不需要保留内存中有很多结果。
因此,在 count()
的情况下,您可以通过将工作拆分为并行处理的多个 block ,然后将相应的计数求和为一个来轻松扩展。你不能用游标/记录集廉价地做到这一点。
关于python - 用于计数查询的 Google Cloud Datastore 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51555774/