App Engine で実行するアプリを調整していますが、最大のコストの 1 つはデータ ストアの読み取りと書き込みです。書き込みの最大の違反者の 1 つは、注文を固執する場合であることに気付きました。
基本データは Order has many items です。両方を別々に保存し、次のように関連付けます。
@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 は、1 つのアイテムの注文に対して 2 つのデータ ストア プットを示していますが、どちらも大量の書き込みを使用しています。経験のある人からこれを最適化する最良の方法を知りたいです。
AppStats データ:
real=34ms api=1695ms コスト=6400 billed_ops=[DATASTORE_WRITE:64]
real=42ms api=995ms コスト=3600 billed_ops=[DATASTORE_WRITE:36]
私が知っている分野のいくつかは、おそらく役立つでしょう:
- 少ないインデックス - appengine にインデックスを作成しないように指示できる多数の注文およびアイテム プロパティに暗黙のインデックスがあります。しかし、それがこれらすべての書き込みの目的ですか?
- item と order の関連付けを解除して、OrderItem エンティティを 1 つだけ持つようにします。これにより、関連付けの必要がまったくなくなります (ただし、余分なストレージが必要になります)。
- 明示的なインデックスに関しては、注文テーブルには注文日ごとに 1 つ、注文アイテムには SKU/日付ごとに 1 つ、暗黙的な関係には 1 つしかありません。
- アイテムがリストではなくコレクションである場合、子 _IDX のインデックスは完全に不要になりますか?
それで、私の質問は、上記の項目のいずれかが大きな勝利を告げるものでしょうか、それとも最初に焦点を当てたほうがよい、私が見逃した他のオプションはありますか?
ボーナス ポイント: 「データストアへの書き込みを減らすためのガイド」という優れた記事がどこかにありますか?