从 Firebase 实时数据库中获取需要几秒钟 [已修改]

Posted

技术标签:

【中文标题】从 Firebase 实时数据库中获取需要几秒钟 [已修改]【英文标题】:Fetching from Firebase realtime database takes several seconds [revised] 【发布时间】:2020-08-12 17:03:21 【问题描述】:

我正在使用 Firebase API 通过实时数据库获取数据。这是一个查询

self.ref.child("books").observeSingleEvent(of: .value, with:  (snapshot) in
    //if the reference have some values
    if snapshot.childrenCount > 0 
        //iterating through all the values
        for bookSnapshot in snapshot.children.allObjects as! [DataSnapshot] 
            if let book = Book(snapshot: bookSnapshot) 

在 LTE 上,加载此查询需要 12 秒。您有什么建议可以加快数据库获取数据的速度?

这是书籍数据库的结构 -

有多个节点,比如 10-happier。


"10-happier" : 
  "amazonBuyUrl" : "https://amzn.to/2nuHTHR",
  "audioUrl" : 
    "chapter1" : "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3"
  ,
  "author" : "Dan Harris",
  "authorDesc" : "test test",
  "body" : "test test",
  "categories" : [ "Self Development", "Psychology", "Biography & Memoir" ],
  "completed" : 
    "10219993430288225" : 1581846137041,
    "1556272301132307" : 1581916289207,
    "3017569394928984" : 1586155390963,
    "3263627003652258" : 1582049236951,
    "A-3Yk9o0FtfHWlZj515mt3zHxtYeQ2" : 1582128686621,
    "A-7oXx7p9b9jgdfbKwsehbDIBXhGC3" : 1581566535161,
    "A-Ho0APgwxoHURm8O92evZr6G9tkt2" : 1581904896082,
    "A-HtKtSqVZgFMBM1yw4gHm3e2hLUg1" : 1584884159090,
    "A-qxlGjJTfchSECP5YsxJM0wSuSIw1" : 1581792731008,
    "G-105788332369376743421" : 1581818412363,
    "G-113771252263706881621" : 1581738757995
  ,
  "courses" : "mindfulness-101",
  "desc" : "test test",
  "free" : false,
  "id" : "10-happier",
  "image" : "https://test.com",
  "lists" : 
    "10101867942050954" : [ "test Test" ]
  ,
  "mediaUrl" : "https://test.com/image",
  "publishDate" : 1589475061979,
  "readCount" : 685,
  "starCount" : 59,
  "stars" : 
    "10101867942050954" : true,
    "10157136524486298" : true,
    "10157477945123673" : true,
    "10157499260876070" : true,
    "1017037695358370" : true,
    "10222308106395933" : true,
    "154186932609338" : true,
    "1556272301132307" : true,
    "2661378620608937" : true,
    "2815111171929439" : true,
    "3038320762848045" : true,
    "A-0ypREkE8fRUtnqxOlxQgGWFrdsp1" : true,
    "A-1XY2T9NjZPSTnpIdwKFFWfWJLx33" : true,
    "A-2rUW7UcYCcT0uZhdxUiO51gPw8N2" : true,
    "A-2v24CZFRW8budbcPWaXB528pXhE2" : true,
    "A-3phIjft84KRjnx3nG8gvvuuExHa2" : true,
    "A-9TaI4W9sHEhFdiuBtRwLRJPaPv72" : true,
    "A-ABOJnyIloSVSfAx06Sp5qX9WKzq1" : true,
    "A-AR3XlMB3QkbVQRvREMhzOjdJKhd2" : true,
    "A-EF1gKttAbYfJEiGx0UjO5KiHbPo2" : true,
    "A-Frq5L8B0A5dbsLNMkMcUv1DKw7F2" : true,
    "A-N4rVyl26YeYCYKtZCYQVbBL6dMh2" : true,
    "A-NWvtTI4spCeCrxmoz8fpEZp68T43" : true,
    "A-NkAFmiH3ohSOIKUKDKLWzlAbc533" : true,
    "A-NvDpA1BZSSSBrpXjjvydM8iqFBQ2" : true,
    "A-PCrfGOW5cqRVoAgA4DqyCqBb1F22" : true,
    "A-QVfzwTST5VOMUxR4oZEHk7rNU9J3" : true,
    "A-RIPsjzsChjXM3Xi7XG4N45R7YIv1" : true,
    "A-W8PlMnlmBsTgUfgqLUseSNJmE0W2" : true,
    "A-Wj3KVZtFmtZRrS1439mUkWfVtIm1" : true,
    "A-YUjrDlXJ1fabthCvgY1Khu5ogVR2" : true,
    "A-YhDT27Ri5Reb12EFHlh00j6dZy53" : true,
    "A-cJNzJZplLZVftha8MGQvbTj4DnE2" : true,
    "A-h49UQNkPDuSM135br3eE2Q8LzCW2" : true,
    "A-lIxOylTfoFWJHTtbE4moylPz04B2" : true,
    "A-rYRWKnQMTMgwQihrr2GPjTOpfEB3" : true,
    "A-u3fWRq2ZqyVQhjjBD1Xkhpc9SUs1" : true,
    "A-u4vyWb96rsdQNcgnwYkOZ46aTeY2" : true,
    "A-ugChjAs0vTRae7Bby6AQzXVPbC83" : true,
    "A-zd22udZZfjfs5hF1SAeAQmEpenl1" : true,
    "A-zi1RWeLxrmXQmPbzqN6gERUyJps2" : true
  ,
  "subtitle" : "How I Tamed the Voice in My Head, Reduced Stress Without Losing My Edge, and Found Self-Help That Actually Works--A True Story",
  "tags" : [ "nyt" ],
  "title" : "10% Happier",
  "uploadDate" : 1589475061979,
  "video" : "https://test.com/video"
    

数据库大小为 3.4MB。有超过 250 个节点。

【问题讨论】:

你在某个地方出了点问题。如果这是 Firebase 中的一个典型节点,它的数据价值大约为 3.1k。如果您有 250 个节点,那就是高达 0.79 Mb(小于 1Mb)。 firebase 有协议和加密开销(大约 3.5k),所以称之为 .8Mb。这不等于 3.4Mb。在 LTE 上,它应该在大约 1.5 秒或更短的时间内完整下载。换句话说,它是极少量的数据。 【参考方案1】:

正如我在您第一次提出这个问题时提到的,您需要减少查询中的数据量。如果您一次不需要所有这些数据,请将其拆分为不同的节点,并根据需要分别查询每个节点。

但我要说的是,根据您在此处显示的指标,您所谓的 LTE 连接似乎很慢。查询本身并没有真正提供任何开销,因为您只是询问单个节点的全部内容。

【讨论】:

以上是关于从 Firebase 实时数据库中获取需要几秒钟 [已修改]的主要内容,如果未能解决你的问题,请参考以下文章

FireBase 实时数据库:回收站视图未填充

无法从从 Firebase 实时数据库中检索数据以在以下代码行中使用它的方法中获取返回值 [重复]

如何从 firebase 实时数据库中获取子值?

如何从 Firebase 实时数据库中检索/获取项目

无法从 firebase 回收器视图中的 firebase 实时数据库中获取嵌套数据

如何在flutter中从firebase实时数据库中获取数据?