Firebase Geofire需要大量时间来加载密钥

Firebase Geofire需要大量时间来加载密钥,firebase,geofire,Firebase,Geofire,我有一个android应用程序,它使用GPS定位和GeoFire获取附近的钥匙。firebase数据库中大约有15000个密钥。从Android应用程序加载附近的按键大约需要20秒。为什么会这样?尽管Firebase Geofire官方文件指出 GeoFire仅选择性地加载某些位置附近的数据,即使使用非常大的数据集,也能保持应用程序的轻量级和响应速度 遵循推荐的数据库结构时,GeoFire的性能非常好。要了解有关使用goefire构建数据的最佳方法的更多信息,请查看此链接 现在有以下方法可以改进

我有一个android应用程序,它使用GPS定位和
GeoFire
获取附近的钥匙。firebase数据库中大约有15000个密钥。从Android应用程序加载附近的按键大约需要20秒。为什么会这样?尽管Firebase Geofire官方文件指出

GeoFire仅选择性地加载某些位置附近的数据,即使使用非常大的数据集,也能保持应用程序的轻量级和响应速度


遵循推荐的数据库结构时,GeoFire的性能非常好。要了解有关使用goefire构建数据的最佳方法的更多信息,请查看此链接

现在有以下方法可以改进您的查询以快速获得结果,即使我不知道您的确切用例,这可能会有所帮助

  • 如果您有非常大的数据集,请尝试以递增的半径进行多个查询。(如果您不执行任何一次需要所有数据的操作,则此方法很好)

  • 如果您想保持更好的用户体验,您可以在geofire查询的KeyEnter方法中放入所需的最小匹配项,并显示该结果,而不是等待所有匹配项。(如果您在listview或recyclerView中显示数据,这会很有帮助)


  • 当我们遵循推荐的数据库结构时,GeoFire的性能非常好。要了解更多关于使用goefire构造数据的最佳方法,请查看此链接

    现在有以下方法可以改进您的查询以快速获得结果,即使我不知道您的确切用例,这可能会有所帮助

  • 如果您有非常大的数据集,请尝试以递增的半径进行多个查询。(如果您不执行任何一次需要所有数据的操作,则此方法很好)

  • 如果您想保持更好的用户体验,您可以在geofire查询的KeyEnter方法中放入所需的最小匹配项,并显示该结果,而不是等待所有匹配项。(如果您在listview或recyclerView中显示数据,这会很有帮助)


  • 确保只在geofire集合中存储GeoHash和Lat/Lon数据。如果需要存储其他数据,可以使用相同的键将其存储在另一个集合中,并根据需要发出单独的查询以获取该数据

    我使用这个结构,它似乎工作得很好

    app-id
    -> geodata
    --> geofire
    ---> key
    ----> g: <geohash>
    -----> l: 
    -------> 0: Lat
    -------> 1: Lon
    
    --> other
    ---> key
    ----> <otherhash object>
    
    然后将数据单独保存在firebase中:

        mDatabase = FirebaseDatabase.getInstance().getReference("geodata");
    
        mDatabase.child("other").child(people.key).setValue(people);
    

    希望这有帮助。:)

    确保只在geofire集合中存储GeoHash和Lat/Lon数据。如果需要存储其他数据,可以使用相同的键将其存储在另一个集合中,并根据需要发出单独的查询以获取该数据

    我使用这个结构,它似乎工作得很好

    app-id
    -> geodata
    --> geofire
    ---> key
    ----> g: <geohash>
    -----> l: 
    -------> 0: Lat
    -------> 1: Lon
    
    --> other
    ---> key
    ----> <otherhash object>
    
    然后将数据单独保存在firebase中:

        mDatabase = FirebaseDatabase.getInstance().getReference("geodata");
    
        mDatabase.child("other").child(people.key).setValue(people);
    

    希望这有帮助。:)

    谢谢你的回答


    我通过在Firebase数据库的安全规则中添加
    “.indexOn:[“g”]
    ,在
    g(geohash)
    上建立索引,解决了我的问题。

    谢谢您的回答


    我通过在Firebase数据库的安全规则中添加
    “.indexOn:[“g”]
    g(geohash)
    上建立索引来解决我的问题。

    您是否向数据库中添加了
    g
    属性的索引,如本文所述和所示?是否向数据库中添加了
    g
    属性的索引,如本文所述和所示?