复合索引为数据存储区中的现有实体写入

时间:2012-08-28 15:47:50

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

我有一个模特:

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次。到目前为止,我理解documentation

但是现在我得到了现有的属性,将'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中'a'和'b'的索引被重写,因为some_list发生了变化:

1 + 12 + 6 = 19写

1 个答案:

答案 0 :(得分: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但由于每个list属性元素都有自己的索引行(每个值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)