データストアは通常のRDBMSとは異なり、NoSQL型データベースになっています。そのため、特性を理解してデータ取得を行わないと、思ったよりもパフォーマンスが出ないと言った問題になります。
今回はskipを指定した場合のデータ取得について解説します。
skipを使うと遅くなる?
skipは1000件を超えるデータがあるクラスに対して、どの範囲でデータを取得するのか指定する時に使います。例えば2000件目から100件取得するといった場合です。ドキュメント : 開発ガイドライン | ニフクラ mobile backendによると、下記のように書かれています。
skipの分だけ読み飛ばして、limit分を返却するため、skipが大きくなるに従ってパフォーマンスが劣化します。
検証
今回はデータストアのクラスに5万件のデータを登録しています。実運用ではこの十倍ということも少なくないでしょう。そして、そのデータをskipを使った場合と、データに1から順番に数字をもたせておき、その数字を使って取得する場合の2パターンで検証します。
スキップを使う場合
今回はJavaScript SDKを使っています。
for (i = 0; i <= 50; i++) { const loopStart = Date.now(); await Speed .skip(i * 1000) .limit(1000) .order('createDate') .fetchAll(); const loopEnd = Date.now(); console.log(loopEnd - loopStart); }
数値を使う場合
数値を使う場合は、最後のデータを取って、次のループではその数値以降のデータを取得しています。
let max = 0; for (i = 0; i <= 50; i++) { const loopStart = Date.now(); const items = await Speed .greaterThan('number', max) .limit(1000) .order('createDate') .fetchAll(); const loopEnd = Date.now(); console.log(loopEnd - loopStart); max = items[items.length-1].number; }
検証結果
検証結果は次のようになりました。3回実行して平均値を取っています。
数値の場合は500ms前後で安定していますが(一度飛び抜けていますが、これは例外値でしょう)、スキップを使った場合は20回目のループ以降(2万件以降)徐々にレスポンスが悪くなっているのが分かります。
まとめ
今回の結果を見る限り、大量のデータがある時にスキップを使うのはお勧めできなさそうです。日付であったり、数値など何らかの検索条件を適用した上でデータを取得する方法がお勧めです。