在具有大型数据集的 Firebase 数据库上查询非常非常慢

Posted

技术标签:

【中文标题】在具有大型数据集的 Firebase 数据库上查询非常非常慢【英文标题】:Querying on Firebase Database with large data set is very very slow 【发布时间】:2017-02-07 15:33:56 【问题描述】:

我在我的 android 应用上使用 Firebase 数据库。通常,它工作正常。但是当数据库越来越大时,查询性能越来越差。我在数据库上添加了大约 5k 条记录(在“elk”和“su”节点下),然后我在数据库上查询(在“cut”和“user”节点上),但所有查询都非常非常慢。我在数据库规则上定义了数据索引,但它不起作用。我该如何解决这个问题?

这是我的疑问:

// query to get the zones followed by user
FirebaseDatabase.getInstance()
                .getReference()
                .child("user")
                .child(userID)
                .child("zones");

// query to get cuts on a zone
FirebaseDatabase.getInstance()
                .getReference()
                .child("cut")
                .child(cutType)
                .orderByChild("zoneID")
                .equalTo(zoneID);

【问题讨论】:

当你说非常非常慢的时候。你的意思是多慢?你有任何测试结果或什么的吗?我们如何知道网络是否正常或手机运行是否正常,在此之前应该有更具体的证据证明您的问题,我们只能假设并指责 firebase 本身运行缓慢。请尝试使用最小、中、大型数据库等生成更具体的测试结果。同时牢记网络强度、手机缓存性能等各种因素。 您在问题中包含了 JSON 树的图片。请将其替换为实际的 JSON 作为文本,您可以通过单击 Firebase 数据库控制台中的导出按钮轻松获取该文本。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。 如果速度很慢,几乎无一例外是您的网络带宽与您正在下载的数据的函数。我没有立即看到任何看起来非常大的东西,而且您的索引对于查询来说看起来是正确的。如果您可以在 jsfiddle/jsbin 中重现该问题,我们可以尝试一下,看看我们的性能与您的相比如何。 当然,我在不同的网络连接、不同的手机、最小和大型数据库上进行了测试。但没有任何改变,查询非常慢(大约需要 4 分钟)。我没有责怪火力基地或任何人。我只是想知道我做错了什么。然后我根据马修伯格的回答解决了这个问题。现在查询不慢了,可以正常工作了。 【参考方案1】:

如果您想继续扩展,最好的办法是将您的数据复制到一个区域引用中,它知道哪个 elk/su 是其中的一部分。像这样的:


    zones: 
        elk: 
            "istan-besik":                 
                "-KSp)bL5....": true,
                ...: true
            
        
    

这样,当你想要搜索所有你会做的事情时:

...child('zones').child(zoneId).child(cutType)

然后循环遍历这些来直接获取每个 elk/su

【讨论】:

其实我也不想继续扩容了,只是给“elk”和“su”节点添加新记录。 所以是的,扩展了这些。无论如何,您都应该以这种方式开始这样做,以使其保持快速。没有 orderBy 使用这种方法,它会非常快。 我会照你说的做。但我不明白一些事情:我不使用“orderBy”查询来获取用户跟随的区域,并且“用户”节点不在“剪切”节点下,只有 2 个用户,但该查询也很慢.这是什么原因? 您的用户查询很慢? 有时可以正常工作,但通常也很慢。

以上是关于在具有大型数据集的 Firebase 数据库上查询非常非常慢的主要内容,如果未能解决你的问题,请参考以下文章

具有大型数据集的组件仅在 IE11/Edge 上运行缓慢

具有大型(70,000+ 项)数据集的高效 jQuery 实时搜索

具有大型数据集的 SQL Server 中的数据透视表

在 Android 中查询大型数据集的最快方法

SQL Server 中对大型数据集的慢速不同查询

R:具有 2 个大型数据集的模式匹配金融时间序列数据: