代码之家  ›  专栏  ›  技术社区  ›  yaswanth

用于计数查询的谷歌云数据存储索引

  •  1
  • yaswanth  · 技术社区  · 8 年前

    谷歌云数据存储规定,需要建立复合索引来查询一种类型的多个字段。以下面的查询为例,

    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()
    

    我使用带ndb的python访问云数据存储。在上面的示例中,查询1引发 NeedIndexError 如果没有在上定义复合索引 user place . 但是查询2工作正常,即使没有索引 用户 地方 .

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

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Alexander Trakhimenok    8 年前

    对于发生这种情况的原因没有明确和直接的解释,但很可能是因为改进的查询计划器如何与 zigzag 索引。

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

    背后的逻辑 count() 工作和 fetch() 不可能是因为 小精灵 你不需要在记忆中保存很多结果。

    所以万一 小精灵 您可以通过将工作拆分为多个并行处理的块,然后将相应的计数加成一个,轻松地进行缩放。使用光标/记录集不能很便宜地做到这一点。