4

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

这里是我的查询:

// 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); 

my database structure

database rules

+2

当你说非常非常缓慢。你的意思是多慢?你有任何测试结果或什么?我们如何知道网络是否正常,或者手机运行良好,应该有更具体的问题证据,直到此时我们只能假设并指责火力点本身的功能缓慢。请尝试使用最小,中等,大型数据库等生成更具体的测试结果。同时牢记网络强度,手机缓存性能等各种因素。 –

+0

您在问题中包含了JSON树的图片。请用实际的JSON替换为文本,您可以通过点击Firebase数据库控制台中的导出按钮轻松获取。将JSON作为文本可以搜索,使我们能够轻松使用它来测试您的实际数据,并将其用于我们的答案中,并且通常只是一件好事。 –

+0

如果速度缓慢,它几乎毫无例外地是网络带宽与您正在下载的数据的函数。我不会立即看到任何看起来非常大的东西,并且您的索引看起来是正确的。如果您可以在jsfiddle/jsbin中重现问题,我们可以尝试一下,看看我们的表现与您的表现相比如何。 –

回答

2

如果你想继续扩大的最好的办法是复制的区参考的数据,其中就知道麋鹿/苏是它的一部分。事情是这样的:

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

当你想搜索所有这样,你只想做:通过这些

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

然后循环去获取每个麋鹿/苏直接

+0

事实上,我不想继续扩展,只需向“elk”和“su”节点添加新记录即可。 – cimenmus

+0

所以是扩大这些。无论你如何开始这样做,以便它保持快速。没有orderBy使用这种方法,它会非常快。 –

+0

我会做你说的。但我不明白:我不使用“orderBy”查询来获取用户所在的区域,而“user”节点不在“cut”节点下,并且只有2个用户,但该查询速度也很慢。这是什么原因? – cimenmus