3

私は次の状況になりました

class M(db.Model):

    a = db.ReferenceProperty(A)

    x = db.ReferenceProperty(X)
    y = db.ReferenceProperty(Y)
    z = db.ReferenceProperty(Z)

    items = db.StringListProperty()

    date = db.DateTimeProperty()

(a)、(x、y、z)、(アイテム)を日付順にフィルタリングするクエリを作成したい。

mm = M.all().filter('a =', a1).filter('x =', x1).filter('items =', i).order('-date')

たとえば、xとyに同時にフィルタを設定したクエリはありません。

だから、私の質問は次のとおりです。

1)いくつの(そしてどの)インデックスを作成する必要がありますか?

2)アイテムにいくつの「文字列」を追加できますか?(数千のオーダーで追加したい)

3)1000個のアイテムがある場合、1つの「M」にいくつのインデックスレコードがありますか?

私はまだこのインデックスのことをよく理解しておらず、私を殺しています。あなたの助けは非常に高く評価されます:)

4

3 に答える 3

2

この記事では、インデックス/展開インデックスについて非常によく説明しており、実際にはあなたの例に適合しています:https ://developers.google.com/appengine/docs/python/datastore/queries#Big_Entities_and_Exploding_Indexes

最大の問題は、おそらく数千のアイテムでエンティティあたり5000のインデックスに遭遇するという事実です。a、x、アイテム(1000アイテム)のインデックスを取得する場合、日付:| a | | x | |アイテム|*|日付| == 1 * 1 * 1000 * 1==1000。

アイテムに5001のエントリがある場合、put()は適切な例外を除いて失敗します。

提供した例から、x、y、またはその他のものでフィルタリングするかどうかは関係がないように見えます。これは、そのプロパティが1つしかないため、インデックスが爆発する可能性がないためです。1 * 1==1。

ここで、2つのリストプロパティがある場合は、それらが別々にインデックス付けされていることを確認する必要があります。そうしないと、爆発的なインデックスが作成されます。たとえば、それぞれ100個のアイテムを持つ2つのリストプロパティがある場合、それらを分割しない限り、100 * 100のインデックスが生成され、結果は200になります(他のすべてのプロパティが非リストであると想定)。

于 2012-05-13T18:12:42.127 に答える
1
  1. 指定した基準では、3つの複合インデックスを作成するだけで済みます:a,x,items,-date、、。リストプロパティは、リスト内の各プロパティのインデックスエントリを作成することに注意してください。a,y,items,-datea,z,items,-date

  2. エンティティごとに合計5000のインデックスエントリの制限があります。複合インデックスが3つしかない場合は、5000/3 = 1666(単一のリストプロパティの上限は1000)です。

  3. 3つの複合インデックスのみの場合、3 * 1000=3000。

注:上記は、プロパティごとに組み込みのインデックスがないことを前提としています(=プロパティはインデックスなしで保存されます)。それ以外の場合は、2Nの組み込みインデックスを考慮する必要があります。ここで、Nは単一プロパティの数です(2はasc、descを表します)。あなたの場合、これは2 *(5 + no_items)になります。これitemsは、がリストプロパティであり、すべてのエントリがインデックスエントリを作成するためです。

于 2012-05-13T19:12:49.987 に答える
1

https://developers.google.com/appengine/articles/indexselectionも参照してください。これは、App Engineの(比較的最近の)改善されたクエリプランニング機能について説明しています。基本的に、必要なインデックスエントリの数を次のように減らすことができます:(フィルタの数+ 1)*(注文の数)。
ただし、記事で説明しているように、複合インデックスを使用する理由はいくつかあります。基本的に、時間と空間のトレードオフがあります。

于 2012-05-14T01:44:27.053 に答える