【问题标题】:Composite Index Writes for existing entities in datastore数据存储中现有实体的复合索引写入
【发布时间】:2012-08-28 15:47:50
【问题描述】:

我有一个模型:

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 改变而重写了 some_list 中 'a' 和 'b' 的索引:

1 + 12 + 6 = 19 次写入

?

【问题讨论】:

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


    【解决方案1】:

    (没有复合索引)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)

    【讨论】:

    • 我也用复合索引对其进行了测试,第二个 put 总共显示了 4 次写入,这意味着复合索引只有一次额外的写入。 'a' 和 'b' 的复合索引没有被触及。
    猜你喜欢
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多