【问题标题】:Google App Engine Datastore index capGoogle App Engine 数据存储区索引上限
【发布时间】:2011-02-27 22:22:24
【问题描述】:

谁能用简单的英语解释数据存储区中的 5000 索引上限。
这是否意味着存储对象的索引列表属性不能超过 5000 个元素?

【问题讨论】:

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


    【解决方案1】:

    Datastore 限制单个实体可以拥有的索引条目数,此限制设置为每个实体 5000 个元素。

    您可以使用带有以下 sn-p 的Interactive shell 轻松测试此限制:

    class Model(db.Model):
       x = db.ListProperty(int)
    
    entity = Model(x = range(5001))
    entity.put()
    
    'Too many indexed properties for entity %r.' % self.key())
    BadRequestError: Too many indexed properties for entity  
    datastore_types.Key.from_path(u'Model', 0, _app=u'shell')
    

    【讨论】:

    • 如何你的例子说明了这个限制?这个答案对我来说仍然不是很清楚。
    • 你的例子说明了什么。没有解释代码的作用以及如何达到限制。
    • 啊好吧,这很简单;基本上,该代码试图将一个包含 5001 个元素列表的实体插入到数据存储中,但 gae 不允许它引发 Too many indexed 异常。尝试使用 5000 个元素应该可以代替。
    • 当您说“元素”时,您是指具有 5001 个值列表的单个实体上的单个属性,或者 5001 个“行”(我称之为实体),每个属性都有不同的值属性“x”? (我正在使用 Java,所以我正在尝试翻译,我不确定数据存储支持是否相同)。如果您遇到相同的错误,我想弄清楚您是否有 5001 个不同的实体(相同种类)和 5001 个不同的值用于相同的索引属性。
    • @NickC 具有 5001 个值列表的单个实体上的单个属性,就是这样。
    【解决方案2】:

    简短的回答,是的,如果您对该属性进行了索引。

    App Engine 会限制单个实体在索引上可以拥有的属性值的数量(行数 * 列数),因为它需要为每个排列创建一个索引。对于单个索引属性,您有 5000rows * 1column = 5000。

    为了说明 App Engine 为何这样做,让我们以他们的 documentation 为例。

    型号:

    class MyModel(db.Model):
       x = db.StringListProperty()
       y = db.StringListProperty()
    

    索引.yaml

    indexes:
    - kind: MyModel
      properties:
      - name: x
      - name: y
    

    执行

    e2 = MyModel()
    e2.x = ['red', 'blue']
    e2.y = [1, 2]
    e2.put()
    

    在这种情况下,App Engine 将不得不为此数据存储条目单独创建 12 个索引,因为您可以有效地搜索任何值组合:

    x1
    x2
    y1
    y2
    x1 y1
    x1 y2
    x2 y1
    x2 y2
    y1 x1
    y1 x2
    y2 x1
    y2 x2
    

    现在,如果您在每个属性中有 100 个值,您可以想象该列表会飙升至数量惊人的查询。

    方程式是这样的

    len(x) + len(y) + (len(x)-1 * len(y) * (len(x) + len(y))) = number of indexed
    
    **2 values per property**
    2 + 2 + (1 * 2 * (2 + 2)) = 12
    
    **100 values per property**
    100 + 100 + (99 * 100 * (100 + 100)) = 1,980,200
    

    【讨论】:

    • 所以这是我的活生生的例子。我有一个日历类和一个子类,事件。日历具有 List 类型的列表属性。我的问题是,这个列表是否可以包含超过 5000 个索引元素(事件)。实际上,我在该列表中添加了超过 5000 个事件实例,并且所有内容都没有错误地存储,因此我很困惑。我可能不了解数据存储的内部工作原理,因此感谢您的澄清。谢谢。
    • 还有一件事要澄清。我没有为该列表使用自定义索引,但由于属性的性质,GAE 会自动生成一个。
    • 如果您的财产没有被“索引”,您可以拥有超过 5000 个项目的列表。如果您的属性已编入索引,则最大数量为 5000。要设置不编入索引的属性,您需要执行以下操作 CalendarEvents = ListProperty(Event, indexed=False)
    • @oviroa 这听起来像是一种非常奇怪的日历建模方式。让 Event 实体拥有一个 ReferenceProperty 来引用它们所在的日历会更有意义。
    • 这个“答案”除了错误之外还使用复合索引增加了混乱。首先,只有 8 个索引行,而不是 12 个(4 个属性索引和 2*2 复合索引)。其次,复合索引是按定义的顺序创建的,因此您不会有任何“y1 x*”或“y2 x*”行。但是,您可以对 x 和 y 进行相等查询,但只能对 x 和按 y 排序的 ASC 进行相等查询,除非您还定义了交换了属性名称的第二个复合索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多