2012-07-22 3 views
10

私は、Python 2.7でスレッドセーフモードをオンにしてNDBを使用しています。keys_only = True、get_multi、または完全なクエリでクエリするのが最善でしょうか?

私はNDBを持つエンティティを照会すると、ローカルキャッシュまたはmemcacheのを使用していないことを理解しますが、キー名により取得とは異なり、データストアに直進します。

したがって、良いパラダイムはkeys_only = Trueでクエリしてから、get_multiを実行して完全なエンティティを取得するだけですか?

keys_only = Trueクエリはkeys_only = Falseよりはるかに高速です.get_multiはget_multiを呼び出すことによってmemcache &を呼び出す可能性があります。クエリを再度実行する必要がある場合は、エンティティがMemcacheに保存されるようになりました。

RPC問合せコール+ get_multiコールがあるという欠点があります.1つのget_multiでエンティティを呼び出す方法に制限があるため、有効な問合せサイズが制限される可能性があります。

あなたはどう思いますか? keys_only = Trueを使用してクエリを実行する必要がありますか?get_multiを実行しますか?特定の最小および最大問合せサイズ制限があるため、この手法は完全なエンティティを戻す問合せのように効果的ではありません。

+1

アプリケーションのデータアクセスパターンを考慮して、クエリ結果の大部分がキャッシュに存在しないか、しばらくの間使用されそうにない場合は常にキャッシュミス率が高くなります。キーのみのクエリとget_multiとの間の直接的な比較は通常のクエリと同じですが、期待される使用パターンでいくつかのテストを実行するのはなぜですか? –

答えて

9

これは、広く研究されてきました。 http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=118

+4

リンクをありがとう。要約すると、keys_onlyクエリを実行する利点があります。エンティティの大部分がすでにmemcacheにあることがわかっている場合は、エンティティキーが返されたget_multiが返されます。 – Dan

関連する問題