【发布时间】:2026-01-11 09:40:01
【问题描述】:
我有一个 android 应用程序,它使用 GPS 位置和GeoFire 获取附近的钥匙。 firebase 数据库中有大约 15,000 个键。从 Android 应用程序加载附近的密钥大约需要 20 秒。为什么会这样?虽然 Firebase Geofire 官方文档指出
GeoFire 有选择地仅加载特定位置附近的数据,让您的应用程序轻巧且响应迅速,即使是非常大的数据集。
【问题讨论】:
我有一个 android 应用程序,它使用 GPS 位置和GeoFire 获取附近的钥匙。 firebase 数据库中有大约 15,000 个键。从 Android 应用程序加载附近的密钥大约需要 20 秒。为什么会这样?虽然 Firebase Geofire 官方文档指出
GeoFire 有选择地仅加载特定位置附近的数据,让您的应用程序轻巧且响应迅速,即使是非常大的数据集。
【问题讨论】:
感谢您的回答。
我通过在 Firebase 数据库的安全规则中添加 ".indexOn": ["g"] 在 g (geohash) 上创建索引解决了我的问题。
【讨论】:
当我们遵循推荐的数据库结构时,GeoFire 的性能非常好。要了解更多关于使用 goefire 构造数据的最佳方法,请查看此链接Recommended database structure with GEOFIRE
现在有以下方法可以改进您的查询以快速获得结果,即使我不知道您的确切用例这可能会有所帮助
如果您有非常大的数据集,请尝试以增加半径进行多次查询。(如果您不执行任何一次需要所有数据的操作,这种方法很好)
【讨论】:
确保您只将 GeoHash 和 Lat / Lon 数据存储在您的 geofire 集合中。如果您需要存储其他数据,您可以将其存储在具有相同键的另一个集合中,并发出单独的查询以根据需要取回该数据。
我用的是这个结构,看起来效果不错。
app-id
-> geodata
--> geofire
---> key
----> g: <geohash>
-----> l:
-------> 0: Lat
-------> 1: Lon
--> other
---> key
----> <otherhash object>
当您保存数据时,您将使用以下方法单独保存 geofire 数据:
mDatabase = FirebaseDatabase.getInstance().getReference("geodata");
geoFire = new GeoFire(mDatabase.child("geofire"));
geoFire.setLocation(people.key, new GeoLocation(people.Lat, people.Lon));
然后您将单独将数据保存在 firebase 中:
mDatabase = FirebaseDatabase.getInstance().getReference("geodata");
mDatabase.child("other").child(people.key).setValue(people);
希望这会有所帮助。 :)
【讨论】: