2

我有一个模型:

class MyModel(db.Model):
  some_list = db.StringListProperty(indexed=True)
  some_value = db.StringProperty(indexed=True)

和一个综合指数:

indexes:
- kind: MyModel
  properties:
  - name: some_list
  - name: some_value

如果我创建一个新实体:

entity = MyModel(some_list=['a', 'b'], some_value='xxx')

然后我将其放入数据存储区:

key = entity.put()

这将导致

  • 2 次写入(在本例中为 2 次写入)
  • 每个索引属性值 2 次写入(在本例中为 2 + 4 次写入)
  • 每个复合索引值 1 次写入(在本例中为 2 次写入)

在这种情况下,总共有 10 次写入。到目前为止,我了解文档

但是现在我得到了现有的属性,将“c”添加到 some_list 并放回去:

existing = MyModel.get(key)
existing.some_list.append('c')
existing.put()

那是多少数据存储写入?

文档说:

1 次写入 + 每个修改的索引属性值 4 次写入 + 每个修改的复合索引值 2 次写入

这是否意味着 some_list 中的 'a' 和 'b' 的索引不需要重写:

1 + 4 + 2 = 7 次写入

或者是因为 some_list 更改而重写了 some_list 中的 'a' 和 'b' 的索引:

1 + 12 + 6 = 19 次写入

?

4

1 回答 1

4

(没有复合索引)appstats 显示如下billed_ops

对于第一把:

@2ms datastore_v3.Put real=169ms api=0ms cost=800 billed_ops=[DATASTORE_WRITE:8]

  • 1 写入实体表
  • 1 写入种类索引表
  • 2 次写入some_value索引表 (asc/desc)
  • 4 次写入some_list索引表(每个附加值 2 次,asc/desc)

对于第二次放置(更新):

@187ms datastore_v3.Put real=50ms api=0ms cost=300 billed_ops=[DATASTORE_WRITE:3]

  • 1 写入实体表
  • 2 次写入some_list索引表(每个附加值 2 次,asc/desc)

文档说4 writes per modified indexed property value,但由于每个列表属性元素都有自己的索引行(每个值 1 行),添加一个元素相当于创建新的索引属性(而不是修改一个)。

但是,如果您修改some_value,这将导致:

@484ms datastore_v3.Put real=46ms api=0ms cost=500 billed_ops=[DATASTORE_WRITE:5]

  • 1 写入实体表
  • 4 次写入some_value索引表(2 次写入用于删除现有行 asc/desc,2 次写入用于添加新行 asc/desc)
于 2012-08-28T16:02:08.217 回答