0

「名前」などのインデックス付きプロパティを持つエンティティがある場合、そのプロパティに対する == クエリのパフォーマンスはどのようになりますか?

もちろん、正確な答えはあり得ないことは理解していますが、パフォーマンスは、name == xある x のエンティティの総数、データストア内のエンティティの総数などとどのように相関していますか?

name == xx に等しい名前のエンティティが 1000 個ある場合、エンティティが 100 個ある場合と比較して、クエリの速度はどれくらい遅くなりますか? これについて何らかのベンチマークが行われましたか?

4

2 に答える 2

2

私の側であまり精力的ではないテストの中には、返される結果の数に応じて応答時間がほぼ直線的に増加することを示したものもあります。1000個のエンティティがある場合でも、クエリにlimit = 100を追加すると、100個のエンティティしかない場合と同じように実行されることに注意してください。

これは、返されるエンティティの数によってパフォーマンスが変化することを示すドキュメントと一致しています。

それほど精力的ではないと言うとき、私は応答時間がいたるところにあったことを意味し、線を引くことは非常に大まかな見積もりでした。同じリクエストで、パフォーマンスに桁違いの違いが見られることがよくあります。

于 2013-03-06T00:57:51.560 に答える
1

AppEngine は非常に最適化された方法でクエリを実行するため、name プロパティに対してクエリを実行するか、キーのみでバッチ取得を実行するかは、パフォーマンスの観点からは実質的に無関係です。どちらも、返されるエンティティの数に比例します。データベースに格納されているエンティティの総数に違いはありません。ただし、わずかな違いは、データベースで発生する「名前」の異なる値の数です (したがって、1000 個のエンティティが返されると、100 個のエンティティが返されるよりも正確に 10 倍遅くなります)。

これを行う方法は、データと一緒に保存されたインデックス (または必要に応じてインデックス) を使用することです。「名前」プロパティのインデックスは、すべての名前がアルファベット順に並べ替えられたテーブルで構成されます (クエリで降順を使用する場合は、2 つ目のテーブルは逆のアルファベット順で並べ替えられます)。テーブルでクエリしている名前が最初に出現し、結果を順番に返し始めます。これを「スキャン」と呼びます。

このビデオは少し技術的ですが、これらすべてがどのように機能するかを詳細に説明しています。パフォーマンスを最大化するためのコーディングに関心がある場合は、時間をかけて投資することをお勧めします。

Google I/O 2008: Google App Engine データストアの裏側

(ビデオの品質はかなり悪いですが、スライドもオンラインにあります(ビデオの上のリンクを参照))

于 2013-03-06T03:30:54.040 に答える