我正在调整我们在 App Engine 上运行的应用程序,最大的成本之一是数据存储读取和写入。我注意到写入的最大违规者之一是当我们坚持订单时。
基本数据是 Order 有很多项目 - 我们分别存储并将它们关联起来,如下所示:
@PersistenceCapable
public class Order implements Serializable {
@Persistent(mappedBy="order")
@Element(dependent = "true")
private List<Item> orderItems;
// other fields too obviously
}
@PersistenceCapable
public class Item implements Serializable {
@Persistent(dependent = "true")
@JsonIgnore
private Order order;
// more fields...
}
appstats 显示了针对单个项目的订单的两个数据存储放置 - 但两者都使用大量写入。我想从任何有经验的人那里了解优化这一点的最佳方法。
AppStats 数据:
真实=34ms api=1695ms 成本=6400 billed_ops=[DATASTORE_WRITE:64]
实际=42ms api=995ms 成本=3600 billed_ops=[DATASTORE_WRITE:36]
我知道的一些领域可能会有所帮助:
- 更少的索引 - 我可以告诉 appengine 不要索引的一些订单和项目属性的隐含索引,例如 item.quantity 不是我需要查询的东西。但这就是所有这些写作的目的吗?
- 取消关联项目和订单,这样我就只有一个实体 OrderItem,完全不需要关系(但需要用额外的存储空间付费)。
- 就显式索引而言,我在订单表上只有 1 个,按订单日期,一个在订单项上,按 SKU/日期,隐含一个关系。
- 如果这些项目是一个集合,而不是一个列表,那会完全消除对子 _IDX 索引的需要吗?
所以,我的问题是,上述任何项目是否预示着重大胜利,还是我错过了其他一些更好的选择?
加分点:某处是否有很好的“减少数据存储写入指南”文章?