【发布时间】:2021-11-28 09:15:07
【问题描述】:
我在 Firebase 实时数据库中有一个数据库,其数据如下所示:
root
|_history
|_{userId}
|_{n1}
| |_ ...
|_{n2}
|_{n...}
节点n 以日期整数值作为键。每个n 节点至少有 60 个键,其中一些值是数组,最大深度为 5 级。
查询时间的测量方式与此类似:
const startTime = performance.now();
await query();
const endTime = performance.now();
logger.info(`Query completed in ${endTime - startTime} ms`);
我有一个函数可以查询history/${userId} 下的n 节点,其中的键介于开始值和结束值之间(包括开始值和结束值):
await admin
.database()
.ref(`history/${userId}`)
.orderByKey()
.startAt(`${start}`)
.endAt(`${end}`)
.once("value")
此查询在可调用的云函数中执行。此查询当前大约需要 2-3 秒,返回大约 225 个节点。 n 节点总数目前不到 300 个。查看我的日志,返回 0 个节点的查询时间看起来大约需要 500 毫秒。
为什么查询这么慢?我对 Firebase 的实时数据库有什么误解吗?
【问题讨论】:
-
代码乍一看很好,所以只是一些故障排除问题/cmets:1)索引似乎与您运行的查询无关,2)您要检索多少数据?你在哪里运行这段代码?那里的带宽是多少? 3) 当您检索较少的数据时,性能如何影响性能?要么通过缩小
start和end之间的范围,要么通过减少每个节点的数据量? -
我已经用更多信息更新了问题正文,这些信息至少应该部分涵盖您评论中的问题。让我知道添加的信息是否足够,或者您是否仍需要更多详细信息。
-
既然你说你在Cloud Functions中运行这个,你能不能用本地的Node.js脚本测试一下,看看性能是否一样?如果不是,那么您问题中的代码可能与性能无关。
-
快速测试平台与 JS SDK 进行对比:jsbin.com/lefosid/6/edit?js,console
-
感谢您为此付出的努力!我重组了一些数据。这已经解决了我上次编辑中第一个查询的问题,我已经将它降低到 10 毫秒以下。我已经更新了问题,删除了关于第一个查询的信息。
标签: node.js firebase-realtime-database firebase-admin