【问题标题】:Queries depending on dataset in Firestore查询取决于 Firestore 中的数据集
【发布时间】:2018-07-15 11:22:09
【问题描述】:

最近我从 firebase 实时数据库迁移到 firebase firestore,因为它说查询的速度取决于从集合中检索的数据集(文档数)的大小,而不是收藏。我检查了 100、5000 和 10000 个集合中不同数量的文档,并且我在一个查询中检索了 20 个文档。我看到的是,当我从集合中的 100、5000 和 10000 个文档移动时,查询的结果时间增加了。为什么会这样? 是因为firestore处于测试阶段吗?

在 android 上查询(收集 21000 个文档)

   collectionReference= FirebaseFirestore.getInstance().collection("_countries").document("+91").collection("_classes-exams").document(String.valueOf(mItem)).collection("_profiles").document(mOtherUserUid==null?uid:mOtherUserUid).collection("user_data");


collectionReference.document("_content").collection(articlesOrQuestions)

                    .orderBy("mTimeStampAsDate", Query.Direction.DESCENDING).limit(20).get().addOnCompleteListener(mCompleteListener)

                    .addOnFailureListener(new OnFailureListener() {

                        @Override

                        public void onFailure(@NonNull Exception e) {

                            Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_LONG).show();

                        }

                    });

查询上述集合引用时android监视器的图像:https://i.stack.imgur.com/QZaVX.jpg

您可以通过查看堆看到查询花费了将近一分钟(一分钟后内存没有太大变化并保持不变,并且在 1 分钟后网络部分突然出现峰值,您可以推断 onComplete 被调用) .调用“get()”函数和“onComplete”回调之间发生了什么。查询小型集合时不会发生这种情况。以及为什么网络上的查询速度很快但在安卓上却很慢? jsbin链接:http://jsbin.com/fusoxoviwa/1/edit?html,css,js,console,output

【问题讨论】:

  • 您很可能会看到将数据传输到您的客户端所需的时间,该时间受设备带宽的限制。但是如果没有看到重现行为的最小代码,就很难说出任何结论。
  • 但我在所有三种情况下都收到了 20 份文件,而且文件相似,因此客户收到的数据在所有三种情况下都是相同的。当集合中的文档数量很大时,是否收到了除文档(20)之外的其他数据。我应该展示我查询的方式吗?但是我怎样才能告诉你数据集是不同的呢? @FrankvanPuffelen
  • 哦,对,相同数量的文档。抱歉,这里还有点早。 :-) 我还没有测试过“性能仅取决于结果集的大小”。你能设置一个类似jsbin的东西来重现差异,让我看看吗?
  • 到目前为止,我只为 android 开发了我的应用程序,但我不知道如何使用我的 firebase 项目设置 jsbin。我们可以进行团队查看器会话,以便您查看并检查差异。如果只能用jsbin查,我可能需要一段时间才能熟悉。 @FrankvanPuffelen
  • 是的,我确实从正在查询子集的客户端编写了所有这些集合。我从设置中清除了应用程序数据,瞧,它加载得非常快。太感谢了 ???? @FrankvanPuffelen

标签: firebase google-cloud-firestore


【解决方案1】:

您是否从同一个 Android 客户端编写了这些集合,该客户端现在正在从中加载文档子集?如果是这样,那就可以解释了。

在这种情况下,客户端缓存将包含有关所有文档的信息,而您的应用会花时间翻阅这些信息。

如果您尝试使用“干净的客户端”,它不会缓存任何信息,并且应该只花时间处理客户端正在请求(或之前请求过)的文档。

您当前看到的行为应该会在 Firestore 退出测试版之前得到改善,因为索引会变得更加高效,而且还会获得某种形式的 GC。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    相关资源
    最近更新 更多