「Google App Engine Anti Patterns by Takashi Matsuo on Prezi」より。
なお、この資料はとても参考になるので、一度目を通しておくといいと思います。
Google App Engineのアンチパターン(2) 不要なインデックス
「検索やソートをしないならインデックスを作らない」
例
class Foo(db.Model):
prop1 = db.StringProperty()
prop2 = db.StringProperty()
prop3 = db.StringProperty()
prop4 = db.StringProperty()
prop5 = db.StringProperty()
prop6 = db.StringProperty()
修正例
class Foo(db.Model):
prop1 = db.StringProperty(indexed=False)
prop2 = db.StringProperty(indexed=False)
prop3 = db.StringProperty(indexed=False)
prop4 = db.StringProperty(indexed=False)
prop5 = db.StringProperty(indexed=False)
prop6 = db.StringProperty(indexed=False)
indexedオプションは日本語のマニュアルには記載がありませんが、英語のマニュアルに記載がありました。
indexedオプションを指定すると、指定したプロパティをインデックスに含めるかどうかを指定できます。
検索やソートをしないプロパティはインデックスに含めないことで、データストアへの追加や削除の時にかかるコストを減らすことが出来ます。
「ソートもインデックスを使うので気を付けましょう」
例
q = MyModel.all().filter("contents =", "word1").order("-created")
entries = q.fetch(10)
上のコードではcreatedプロパティにもインデックスが必要です。
修正例
q = MyModel.all().filter("contents =", "word1").filter("created_month =", this_month)
entries = q.fetch(1000)
#メモリー上でソート
entries.sort(cmp=lambda x,y: cmp(x.created, y.created))
取得するデータを条件指定で絞り込み、ソートはメモリー上で行います。
こうすることでcreatedプロパティのインデックスが不要になります。