【问题标题】:databaseReference.OrderByKey().LimitToLast(5) is super slow when DB is large数据库很大时,databaseReference.OrderByKey().LimitToLast(5) 超级慢
【发布时间】:2021-08-04 23:44:43
【问题描述】:

我用这个代码

   DatabaseReference dtr = FirebaseDatabase.DefaultInstance.GetReference(path);
   dtr.KeepSynced(true);
   dtr.OrderByKey().EndAt(lastKey).LimitToLast(5).GetValueAsync()......

因为该路径有很多子路径,我每次使用 LimitToLast 只检索 5 个结果(以及稍后的 EndAt

问题是检索一个结果需要 4 秒,以前是 1 秒。我担心它只会变得更糟。即使我将任务限制为只有 5 个,它显然仍然会遍历数据库中的所有子项,但我的数据库已经默认按 key 排序,我该怎么做才能让它更快?


我尝试了弗兰克的解决方案并将其更改为

DatabaseReference dtr =  FirebaseDatabase.DefaultInstance.GetReference(path);
        
var query = dtr.OrderByKey().EndAt(lastKey).LimitToLast(5);

query.KeepSynced(true);

query.GetValueAsync().ContinueWith....

但我仍然需要等待 4 秒才能返回任务

【问题讨论】:

    标签: c# firebase unity3d firebase-realtime-database


    【解决方案1】:

    您通过在其上调用dtr.KeepSynced(true); 来保持整个节点同步。然后您只从该同步节点检索 5 个项目,这意味着 SDK 仍然必须为所有节点完成工作 - 然后将除 5 个节点之外的所有节点都扔掉。

    如果您只想显示 5 个节点,请调用 KeepSynced(true) on the query 而不是其父引用。

    var query = dtr.OrderByKey().LimitToLast(5);
    query.KeepSynced(true);
    query.GetValueAsync()......
    

    【讨论】:

      猜你喜欢
      • 2021-07-29
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多