【问题标题】:CloudFirestore how to query large dataset?Cloud Firestore 如何查询大型数据集?
【发布时间】:2021-04-20 22:42:58
【问题描述】:

我正在尝试查询具有 180k 文档的云 Firestore 中的数据集,但过程非常长(70 秒),为了避免这种情况,我应该将我的集合拆分为子集合还是有更多的有效率吗?

查询功能

Future getProfList(String uni, String department, bool asynCall) async {
  
  List<Academician> academicianList = [];
  await FirebaseFirestore.instance
      .collection('academicians')
      .where('university', isEqualTo: academicianFilter(uni))
      .where(stringCorrector('field'), isEqualTo: academicianFilter(department))
      .get()
      .then((value) => value.docs.forEach((element) {
            academicianList.add(Academician.fromJson(element));
          }));
  asynCall = false;
  return academicianList;
}

官方文档

根据https://firebase.googleblog.com/2017/10/introducing-cloud-firestore.html 我的数据集在这里应该没有问题,我的结果集主要是 50-100 个文档。

使用集合和文档来构建和查询数据。这个数据 模型对于许多开发人员来说是熟悉且直观的。它还允许 用于表达性查询。查询随结果的大小而变化 集,而不是数据集的大小,因此您将获得相同的性能 从一组 100 个或 100,000,000 个中提取 1 个结果。

【问题讨论】:

  • 应该不需要拆分集合。您是否有机会添加来自运行查询的同一设备的数据?
  • 是的,我今天早上添加了文档并尝试从同一设备运行查询

标签: database firebase flutter google-cloud-firestore database-design


【解决方案1】:

Firestore 实际上保证执行查询所需的时间取决于查询返回的数据量,而不是集合中存在的数据量。

不幸的是(正如您的问题的 cmets 所证实的那样)您在这里遇到了极端情况。此保证适用于在服务器上运行的查询,这是最常见的用例。

但是由于您从同一设备添加数据,因此您在该设备上拥有一个本地数据库/缓存,其中还包含所有这些文档。并且性能保证不适用于针对本地缓存的查询。

因此,获得预期性能的最简单方法是清除本地缓存,例如通过卸载/重新安装应用程序。然后您将处于更常见的场景中,您的查询被发送到服务器,并且所花费的时间(仅)与您检索的文档数量成正比。

【讨论】:

  • 很高兴听到。很抱歉你碰到了这个。这种情况非常罕见,我们没有明确记录它,因为它解释起来非常混乱 - 并且非常违反直觉,针对本地缓存的查询比针对服务器的查询要慢。
猜你喜欢
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 2019-09-17
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
相关资源
最近更新 更多