【问题标题】:Firebase real time database simple select query extremely slowFirebase 实时数据库简单选择查询极慢
【发布时间】:2021-10-06 04:46:28
【问题描述】:

编辑:在评论orderByChild 后,请求实际上似乎更快,但仍需要大约 15 秒才能完成。

下面是我用来从 Firebase 实时数据库中检索订单的函数的开头。它是位于我的 Cloud Functions index.js 文件中的一个函数:

function updateStatsForDay(db, day_moment, cronSpeed, devOnly) {

  console.log('updateStatsForDay START', cronSpeed, devOnly);
  const today = day_moment.hours(0).minutes(0).seconds(0).milliseconds(0).format('YYYY-MM-DD');

  return db.ref('/orders')
    // .orderByChild('event_start_date').endAt(today)// Prevent listing events in the future
    .once('value', snapshot => {
      console.log('updateStatsForDay orders retrieved');

这个表orders 大约只有 300 行,但是这个简单的查询有时需要长达 40 秒才能检索它们(两个控制台日志之间花费的时间)。我尝试评论 orderByChild 过滤器,认为这可能是问题所在,但请求仍然很慢。

这里有什么我遗漏的吗?

这是数据库中订单的示例:

此表为如下规则:

"orders": {
      ".indexOn": ["uid", "event_start_date"]
    },

【问题讨论】:

  • 我没有立即在该代码中看到任何会导致查询本身变慢的内容。你要下拉多少数据(看看它是否可能与带宽而不是查询速度有关)?
  • @FrankvanPuffelen 我不确定如何获取此信息,但在导出完整的订单表后,我得到了一个 598KB 的 JSON 文件。
  • “有时长达 40 秒”。如果你连续运行两次,第二次运行会更快吗?因为如果您的函数有一段时间不使用,它们可能需要一段时间才能再次启动。虽然仅仅获得这么多数据需要 40 秒(虽然它很多,而不是 那么 很多)仍然很奇怪..
  • @funkizer 在我的开发环境中,这个函数在 cron 中每分钟执行一次,所以这里应该不是问题。
  • 我也没有发现任何可能导致查询速度变慢的特殊情况,但我建议您关注this 讨论 RTDB 优化的文档

标签: node.js firebase firebase-realtime-database google-cloud-functions


【解决方案1】:

我不确定您的数据结构,但如果它有嵌套数据,这可能是一个问题,您可能希望将其重新构建为尽可能平坦。

来自 firebase 文档:

因为 Firebase 实时数据库允许嵌套最多 32 个数据 层次很深,你可能会认为这应该是 默认结构。但是,当您在您的 数据库,您还可以检索其所有子节点。此外,当 您授予某人对数据库中某个节点的读取或写入访问权限,您 还授予他们访问该节点下所有数据的权限。因此,在 实践中,最好保持数据结构尽可能平坦。

参考:Firebase: Best practices for data structure

【讨论】:

    猜你喜欢
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    相关资源
    最近更新 更多