2012-02-24 13 views
0

Google App Engineのデータストアに数百万のレコードが含まれている可能性があるため、複数の文字列に一致するレコードを取得するための最良の方法を見つけようとしています。Google App Engineのクエリの最適化

例えば、私は以下のモデルを持っていると言う:

文字列名 文字列レベル のInt私も」のリストと一致与えられた「レベル」のすべてのレコードを返す必要が

スコア名前 "。

これは基本的に、特定のレベル(「レベル」)のプレーヤー(「名前」)のハイスコア(「スコア」)のリストです。名前リストには名前が1つまたは2つしかない可能性があります。 )。私はあなたの友人だけを含む高得点リストを構築するために、 "名前"によって選手のリストのための任意の "レベル"のすべてのスコアを見つけるしたい。

「名前」のリストをループして、そのレベルの高得点ごとにクエリを実行できますが、これが最善の方法であるかどうかはわかりません。 SQLでは、これを行うための単一(複雑な)クエリを作成することができました。

データストアのサイズを考えると、私は、クエリによって実行されるはずのPythonコードを実行する時間を無駄にしないようにしたいと思います。

"レベル"は数字ではなくレベル名ではないので、文字列でなくIntでなければなりませんが、それが重要かどうかはわかりません。

答えて

0

あなたは(ユーザー名)の値のリストに対してプロパティと一致するIN filter operatorを使用することができます。

scores = Scores.all().filter('level ==', level).filter('user IN', user_list) 

user_listのユーザーがあるとしてボンネットの下に、これはできるだけ多くのクエリを実行していること。

0
players = Player.all().filter('level =', level).order('score') 

names = [name1, name2, name3, ...] 

players = [p for p in players if p.name in names] 

for player in players: 
    print name, print score 

これは何ですか?
...あまりに単純すぎるのですか?

+0

私の心配は、Player.all()。filter(...)クエリが数十万のレコードを返す可能性があることです。明らかに、誰かによって行われるような作業ですが、データベースエンジンがそれを行うために最適化されているかもしれません(mysqlはPHPよりもむしろ)。その作業をGAEデータベースにオフロードする方法がなく、その動作方法がわからないかもしれません。 –

0

いいえあなたは1回のパスでそれを行うことはできません。あなたは1

または

によってレベル1のために友人を照会するか必要があります

は友人が各レベルのエンティティを獲得します。スコアが変わるたびに、彼が所属する友達リストを確認し、それらのリストをすべて更新します。その後、その問題だけ、またはそのリストを取得します。

最初のものは遅く、2番目のものは最適化されていないとコストがかかります。

+0

2番目のオプションは興味深いアイデアです。私はそれが何のように見えるかもしれない。ありがとう。 –

+0

これは間違っています。 'IN'フィルタ演算子を使って、値のリストに対してクエリを実行することができます。 –

+0

はい、私はIN演算子について忘れました、あなたはそれを使用することができます。 30人以上の友人がいる場合は、サブクエリが30に制限されているため、2つのクエリを作成する必要があります。 – Mahron

関連する問題