Slim3 大量のデータを扱う時のcpu時間に関するメモと疑問

前提:
双方向1対多関連で
Department(1) <---> Employee(多)

目標:Employeeを200件とってくる時間(api_cpu_ms)を減らしたい。

実験1:普通に検索でとってくる

List ls = Datastore.query(b)
.filter(b.departmentID.equal("dep001"))
.limit(200)
.asList();

時間:2000api_cpu_msくらい。コストが大きすぎる。

実験2:検索結果の内容を文字列としてキャッシュしておく(ひとつのエンティティのみ取得)

時間:5api_cpu_msくらい。まあ1つしかアクセスしないんだから当然と言えば当然。

今作ろうとしているアプリケーションは、200件分のEmployeeを頻繁にreadし、また頻繁にwrite(add,update,delete)もされるような仕様となっている。
なので、上記のようなキャッシュの仕組みを取ることで、read時の負荷は大幅に減らせるものの、
write時(update)の負荷に関してどうしたらいいのか、とさまよっていた。

頻繁にwrite(add,update,delete)するといっても、200件全てを変更するわけでなく、その内の1件だけを変更する。
でも、その更新の度に200件分の検索結果としてキャッシュを作らなければならないため、やはり、200件すべてを取ってくる必要がある。
つまり更新の度に2000api_cpu_msを消費してしまう。
これはたぶんMemcacheを使っても同じ理屈で破綻すると思う。

そこで実験3。

実験3:Slim3のリレーション(ModelRef)を使ってみた

List employeeList = department.getEmployeeListRef().getModelList();

しかし、時間は1800api_cpu_msくらいで、実験1のように普通に検索したときとほとんど変わらなかったorz

なんか良い方法はないのかな

誰か助言を下さい

                                              • -

追記:

その後いろいろ考えて、キャッシュをキャッシュとしてだけでなく、データそのものとして扱ってはどうかと考えました。
つまり200件のデータを、ひとつのエンティティの中に文字列として持っておき、更新時には、文字列処理で、書き換える。

自分のアプリの仕様の場合はこれでいけそう。