1

GAEにモデルFooがあり、次のクエリがあるとします。

query = Foo.all()。order('- key ')

n番目のレコードを取得したい。それを達成するための最も効率的な方法は何ですか?

以下のように、順序付けプロパティが一意でない場合、ソリューションは機能しなくなりますか?

query = Foo.all()。order('- color ')

編集:n> 1000

編集2:利用可能なページ(ページ1、ページ2、...ページ185など)を表示し、クエリ文字列に「?ブックマーク」ではなく「?page=x」を必要とするわかりやすいページングメカニズムを開発したい=XXX"。page = xの場合、クエリはそのページの最初のレコードから始まるレコードをフェッチすることです。

4

2 に答える 2

3

これを行う効率的な方法はありません - どの DBMS にもあります。いずれの場合も、少なくとも n 番目のレコードが見つかるまでインデックス レコードを順番に読み取ってから、対応するデータ レコードを検索する必要があります。これは、GAE で fetch(count, offset) が行うこととほぼ同じですが、さらに 1000 レコードという制限があります。

これに対するより良いアプローチは、取得した最後のエンティティに対して注文しているフィールドの値とエンティティのキ​​ーで構成される「ブックマーク」を保持することです。次に、中断したところから続行したい場合は、フィールドの値を不等式クエリの下限として追加し、最後に見たものと一致するか超えるまでレコードをスキップできます。

ユーザーに「わかりやすい」ページ オフセットを提供したい場合、memcache を使用して、開始オフセットとブックマーク (order_property、キー) タプルの間の関連付けを保存することができます。ページを生成するときに、最後のエンティティに続くエンティティのブックマークを挿入または更新します。ページをフェッチするとき、ブックマークが存在する場合はそれを使用するか、オフセットを使用してクエリを実行するという難しい方法でブックマークを生成します。オフセットが十分に高い場合は、複数のクエリを実行する可能性があります。

于 2009-05-05T22:14:26.003 に答える
2

Query クラスのドキュメントは、 http ://code.google.com/appengine/docs/python/datastore/queryclass.html#Query にあります。

クエリクラスは、ケース1とnでフェッチウィッチが制限とオフセットを取得することを提供します

フェッチの実行時間は、オフセット + 制限に比例して増加します。

したがって、あなたの場合に最適化する唯一の方法は、最も頻繁にアクセスしたいレコードが配列の先頭に近いことを確認することです。

query.filter('key = ', n) query.get() を使用できます

これは、キーが n の最初の一致を返します

于 2009-05-05T22:01:27.843 に答える