Google App Engine数据存储区索引上限

时间:2011-02-27 03:28:10

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

有人可以用简单的英语解释数据存储区中的5000索引上限 这是否意味着存储对象的索引列表属性不能包含更多5000个元素?

2 个答案:

答案 0 :(得分:10)

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

您可以使用以下代码段的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')

答案 1 :(得分:2)

简短回答,,如果您为该财产编制索引。

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

为了说明App Engine执行此操作的原因,让我们从他们的documentation中获取示例。

型号:

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

index.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