Firebase能否仅对查询部分节点keepSynced及优化日常查询耗时?
问题1:是否可以仅对节点的指定查询部分执行keepSynced?
可以,keepSynced()本身支持直接绑定到Query对象,不需要同步整个outputs节点。你遇到的Failed Assertion Error通常是以下两个原因导致:
- 所用的Firebase Realtime Database SDK版本过低,旧版本不支持对带过滤条件的查询直接调用
keepSynced,升级到对应平台的最新稳定版即可解决 - 代码执行时
yesterdayDate、todayDate变量未完成初始化,传入了非法的查询参数触发断言
修复版本或参数问题后,你贴的查询代码本身可以正常运行,SDK只会同步符合date范围的20-30条数据到本地缓存,不会拉取整个节点的数千条记录。
问题2:高频近两日/当日出库查询的优化方案
你已经配置了date字段的索引,这个是基础优化项,在此之上还有以下优化手段可以进一步降低查询耗时:
- 开启查询级别的
keepSynced后,后续相同查询会优先读取本地缓存,只有服务端对应范围的数据有更新时才会拉取增量,常规查询耗时可以降到毫秒级,建议在用户进入出库查询页面时开启同步,离开页面时调用keepSynced(false)取消同步,避免后台不必要的资源消耗 - 如果后续数据量持续上涨,可以按日期维度拆分数据结构:把
outputs节点按年月日拆分为outputs/YYYYMM/DD的层级结构,查询近两日数据时直接读取对应两个日期的子节点即可,不需要做范围过滤,性能会有数量级的提升 - 给查询增加条数限制:在现有查询后追加
.limitToLast(100),因为你近两日的记录最多只有30条,增加上限可以避免特殊场景下返回过多数据,也能小幅提升查询性能 - 本地补充业务层缓存:可以在APP本地单独维护最近7天的出库记录,仅在用户主动刷新或者APP冷启动时才去服务端同步最新数据,日常查询直接读取本地存储,完全规避网络请求耗时
内容的提问来源于stack exchange,提问作者David L
相关产品推荐
相关产品推荐

