FJCT_ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

データストアの取得を高速化するには

f:id:mbaasdevrel:20180913163950p:plain

データストアは通常の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回実行して平均値を取っています。

f:id:mbaasdevrel:20190621145524p:plain

数値の場合は500ms前後で安定していますが(一度飛び抜けていますが、これは例外値でしょう)、スキップを使った場合は20回目のループ以降(2万件以降)徐々にレスポンスが悪くなっているのが分かります。

まとめ

今回の結果を見る限り、大量のデータがある時にスキップを使うのはお勧めできなさそうです。日付であったり、数値など何らかの検索条件を適用した上でデータを取得する方法がお勧めです。

ドキュメント : 開発ガイドライン | ニフクラ mobile backend)

中津川 篤司

中津川 篤司

NCMBエヴァンジェリスト。プログラマ、エンジニアとしていくつかの企業で働き、28歳のときに独立。 2004年、まだ情報が少なかったオープンソースソフトの技術ブログ「MOONGIFT」を開設し、毎日情報を発信している。2013年に法人化、ビジネスとエンジニアを結ぶDXエージェンシー「DevRel」活動をスタート。