クラウド実行環境

Firebaseとは|「何件目から」で一覧を送ると、最後まででの読み取りが10001倍になった

一覧の送り方で何が変わるのか入れ子で持つと何が起きるのか件数はどう数えるのか

50万件の一覧を25件ずつ送るとき、「何件目から」で指定すると合計50億件を読むことになりました。

「続きの目印」なら50万件です。10001倍の差が、指定の仕方だけで生まれます。

この記事の要点

  • 1000ページ目で1000倍
  • 最後まででは10001倍
  • 子1,000件の入れ子で1008倍
  • 1000万件を数えると12000.0ms

「何件目から」で送ると、1000ページ目は1000倍読む

問い合わせで絞れます。ただし送り方の指定によって、読む件数が桁で変わります。

Firebaseの文書の置き場では、条件で絞って取り出せます。公式はCloud Firestoreでは、個々の特定の文書を取り出したり、条件に合う集まりの中の文書をすべて取り出したりするために、問い合わせを使えると述べています。

取り出し方は1つではありません。送り方を変えて実際に数えて比べました。

ページの位置を変える

text
一覧 500,000件を 25件ずつ送る
「何件目から」で指定する場合と、「続きの目印」で指定する場合を比べる

ページ      何件目からで指定(読む件数)      続きの目印で指定(読む件数)      比
       1ページ目                           25件                           25件        1倍
      10ページ目                          250件                           25件       10倍
     100ページ目                        2,500件                           25件      100倍
    1000ページ目                       25,000件                           25件     1000倍
    4000ページ目                      100,000件                           25件     4000倍

1ページ目はどちらも25件です。差が出るのは後ろのページでした。

1000ページ目では25,000件を読みます。飛ばす分もいったん数える必要があるためです。

最後まで送ると

text
最後まで送りきった場合の合計

何件目からで指定  5,000,250,000件
続きの目印で指定  500,000件
比                10001倍

合計では10001倍です。50万件の一覧を送るのに、50億件を読むことになります。

続きの目印で送れば、何ページ目でも25件です。合計もちょうど50万件で済みます

この形はデータベース設計の記事でも扱っていて、件数が増えたときに初めて表面化します。

後ろのページほど、読む件数が増え続ける。

単位: 倍4000ページ目4000倍1000ページ目1000倍100ページ目100倍10ページ目10倍1ページ目1倍25件ずつ送る場合の実測。続きの目印で送れば、どのページでも25件のまま。
図1 ── ページの位置と、読む件数の比
出典Firebase 公式ドキュメント「Cloud Firestore」2026-08-18 確認
In Cloud Firestore, you can use queries to retrieve individual, specific documents or to retrieve all the documents in a collection that match your query parameters.
原文Firebase 公式ドキュメント「Cloud Firestore」 この内容の有効期限2027-02-18

子を1,000件持つ文書に1件足すと、1008倍を書く

入れ子でも下位の集まりでも持てます。入れ子は読みやすい代わりに、書き直しが増えます。

Firebaseの文書は、入れ子の対象を持てます。公式は文書は、下位の集まりに加えて、入り組んだ入れ子の対象を含められると述べています。

どちらで持つかで書く量が変わります。実際に数えて比べました。

子の数を変える

text
親の文書は 400バイト。子を入れ子で持つ場合と、別の集まりに置く場合を比べる
子は1件 60バイト

子の数        入れ子で持つ(1件の大きさ)      子を1件足すのに書く量      別に置く場合に書く量      比
          0件                        400バイト                      460バイト                     60バイト        8倍
         10件                      1,000バイト                    1,060バイト                     60バイト       18倍
        100件                      6,400バイト                    6,460バイト                     60バイト      108倍
      1,000件                     60,400バイト                   60,460バイト                     60バイト     1008倍
      5,000件                    300,400バイト                  300,460バイト                     60バイト     5008倍

子が10件までなら18倍です。この範囲なら気にする必要はありません

1,000件になると1008倍です。60バイトを足すために60,460バイトを書きます

増え続けるものは分ける

分かれ目は、子の数が上限を持つかどうかです。決まった数なら入れ子で構いません。

履歴や書き込みのように増え続けるものは、下位の集まりに置きます。そうすれば書く量は60バイトのままです。

代わりに、親と一緒に読むには追加の読み取りが要ります。読む回数と書く量の取り替えになります。

出典Firebase 公式ドキュメント「Cloud Firestore」2026-08-18 確認
Documents can contain complex nested objects in addition to subcollections.
原文Firebase 公式ドキュメント「Cloud Firestore」 この内容の有効期限2027-02-18

1000万件を数えるだけで12000.0msかかる

文書を集まりへまとめる形です。件数を知りたいだけでも、読む必要が出てきます。

Firebaseでは、文書を集まりへまとめて置きます。公式はデータは文書として置き、集まりへまとめると述べています。

この形では、件数を知るのに全部読むことになります。どれだけかかるのか実際に数えてみました。

2つのやり方を並べる

text
件数を知る2つのやり方を比べる

件数        ぜんぶ読んで数える      別に数を持っておく
      1,000件               1.2ms(1,000件読む)             0.0ms(1件読む)
    100,000件           120.0ms(100,000件読む)             0.0ms(1件読む)
 10,000,000件      12000.0ms(10,000,000件読む)             0.0ms(1件読む)

1,000件なら1.2msで済みます。この規模では問題になりません

1000万件では12000.0msです。画面に数字を1つ出すために12秒かかることになります。

別に持つと集中する

text
別に数を持つ場合、その1件に書き込みが集中する

1秒あたりの更新                  1個に分ける               10個に分ける              100個に分ける
1回/秒                            1.0回/秒                0.1回/秒                0.0回/秒
10回/秒                          10.0回/秒                1.0回/秒                0.1回/秒
100回/秒                        100.0回/秒               10.0回/秒                1.0回/秒
1000回/秒                      1000.0回/秒              100.0回/秒               10.0回/秒

数を1件で持つと、更新がそのままその1件に集まります。毎秒1000回なら1000回/秒です。

100個に分ければ10.0回/秒まで下がります。読むときは100件を足すことになります。

余談 この計測での注意

3つの計測はいずれも手元で書いた模型で、実際のCloud Firestoreを叩いたものではありません。1件1.2マイクロ秒や1件60バイトといった値は置いたもので、実際の課金の単位や速度とは違います。件数を数える専用の手段が用意されている場合、この表よりずっと速くなります。「何件目から」の読み取り件数も、実装によっては途中を飛ばせることがあります。ここで見せているのは、送り方の指定だけで読む件数が桁で変わるという点と、増え続けるものを入れ子で持つと書く量が比例して増えるという点の2つです。

出典Firebase 公式ドキュメント「Cloud Firestore」2026-08-18 確認
Store your data in documents, organized into collections.
原文Firebase 公式ドキュメント「Cloud Firestore」 この内容の有効期限2027-02-18

よくある質問

Cloud Firestoreはどうデータを持ちますか
文書として置き、集まりへまとめます。文書は入れ子の対象や下位の集まりも持てると説明されています。
一覧はどう送るべきですか
続きの目印を使います。何件目からで指定すると、1000ページ目で1000倍の件数を読みました。
入れ子で持つと何が困りますか
書き直す量です。子を1,000件持つ文書に1件足すだけで、60,460バイトを書きました。
件数はどう数えますか
別に数を持ちます。1000万件を読んで数えると12000.0msかかりました。

まとめ

  • 送り方で読む件数が桁違い
  • 後ろのページほど重くなる
  • 入れ子は書き直しを増やす
  • 件数は別に持つ

今日から始められること

  1. 一覧の送り方を確かめる
  2. 何ページ目まで送られているか調べる
  3. 入れ子で持っている子の数を数える
  4. 件数を数えている箇所を探す

実務で組んだFirebaseのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る