1

GAE の読み取りと書き込みをできるだけ効率的に実行しようとしていますが、次の 2 つのオプションのうちどちらが最適か疑問に思っていました。

ユーザーがさまざまなものを投稿できる Web サイトがあり、そのユーザーによるすべての投稿を表示したいときはいつでも、そのユーザーのユーザー ID を使用してすべての投稿に対してクエリを実行し、それらを表示します。すべての投稿 ID をユーザー エンティティに保存し、get_by_id(post_ID_list) を実行してすべての投稿を返す方がよいでしょうか? それとも、使用されている余分なスペースは価値がないのでしょうか?

Web アプリを最適化するために、このような詳細情報を見つけることができる場所はありますか?

ありがとう!

4

3 に答える 3

1

ID のリストを保存する主な理由は、一貫性を高めるために各エンティティを個別に取得できるようにするためです。ID によるエンティティ取得はデータストア内の最新バージョンと一貫性があり、クエリは最終的に一貫性があります。

データストアのコストを確認し、コストを最適化する: https://developers.google.com/appengine/docs/billing

キーでエンティティを取得することは、すべての投稿をクエリすることよりも安くはありません。クエリはインデックスを使用します。

プロジェクション クエリを使用すると、コストを大幅に削減できます。

于 2012-09-22T18:53:26.980 に答える
0

いくつかの場合があります。

まず、ユーザーの投稿のすべてのIDを追跡する場合。一貫性を保つためにエンティティグループを使用する必要があります。つまり、データストアへの書き込み速度は1秒あたり最大1エンティティになります。また、コストは、IDを持つオブジェクトに対して1回の読み取り、エンティティごとに1回の読み取りです。

次に、クエリを使用する場合。これは一貫性を必要としません。コストは、取得したエンティティごとに1回の読み取り+1回の読み取りです。

第三に、キーのみをクワイアし、フェッチした後の場合。コストは、取得したキーごとに1回の読み取り+1回の小額です。これを見る:キーのみのクエリ。これは、コストの予測を求めることに相当します。

また、結果が多く、ページ付けを使用する場合は、クエリカーソルを使用する必要があります。これにより、データストアの無駄な使用を防ぐことができます。

最も経済的な解決策は3番目のケースです。これを見てください:バッチ操作

于 2012-10-02T22:21:54.333 に答える
0

ID がエンティティと共に保存されているために ID のリストがある場合は、ndb.get_multi を呼び出してください (NDB を使用している場合ですが、memcache を使用して単一のエンティティをキャッシュする他のフレームワークと同様です)。キーに対応するエンティティのすべて (またはほとんど) が既にデータストアにある場合は、さらにデータストアを呼び出します。

したがって、可能な限り最良のケース (すべてが memcache にある) では、データストアはまったく変更されませんが、クエリを使用すると変更が行われます。

議論と警告については、http ://code.google.com/p/appengine-ndb-experiment/issues/detail?id=118 の問題を参照してください。

于 2013-05-23T10:24:33.343 に答える