寻找可移动的地理标记对象的体系结构

时间:2010-05-09 19:27:55

标签: ruby-on-rails ruby geolocation

我目前有一个填充大约的Postgres DB。全世界300,000个移动车辆数据集。我经常反复询问的是:给我所有车辆在5/10 / 20英里半径范围内。目前,我在DB中花费大约600到1200毫秒来准备一组定位的车辆对象。

如果可能的话,我希望通过理想的一到两个数量级来大大改善这个时间。我正在Ruby on Rails 3.0beta环境中工作,如果这是相关的。

如何构建整个系统以加速此查询的任何想法?任何能够提供这种地理定位性能的NoSQL数据库?我知道MongoDB正在开发一个扩展来促进这种情况,但还没有尝试过。是否有任何智能使用Redis来实现这一目标?

SQL-DBs的一个问题似乎是我不可能使用索引,因为我的车辆大部分都在移动,这意味着我不得不不断创建数据库索引,这些数据索引本身可能比仅执行没有索引的搜索。

期待你的感谢,谢谢!

2 个答案:

答案 0 :(得分:1)

如果您使用正确的算法来整理数据,则可以使用spatial index来大大加快查询速度。

地理位置域的最佳做法是使用geohashquad-treeR-tree或类似的数据结构(R树是最通用的,但听起来像你'重新查询点数据,这可能无关紧要)。在每种情况下,您都可以创建一个使用单个线性列的空间索引,其中每个值表示不同大小和形状的边界框。这应该允许您在数据库中使用单个范围查询回答大多数查询。空间索引可以在SQL中实现(PostGISMS SQLMySQL都具有空间数据类型和使用这些技术之一的空间索引)或NoSQL(因其水平可伸缩性而流行; AppEngine具有geomodel,SimpleGeo使用Cassandra,Foursquare使用MongoDB

使用索引可能因不断移动点而变得复杂,但我怀疑写入,即使是稍微更重的更新索引的写入,也不会成为你的瓶颈。

答案 1 :(得分:0)

即使你的车辆一直在移动,我认为它们有某种速度限制。你可以做的是创建某种离散坐标系,一个例子是lat / long坐标的整数部分。然后将这些值放在单独的列中,将确切位置保留在另一列中。然后,您应该能够对整数列进行索引,因为车辆不会移动太多,以至于他们经常更改这些值。

在进行搜索时,首先要找出哪些“正方形”很有趣,并使用索引列将查询限制在这些sqeares中的vechicle上。然后你必须对每个广场内的所有车辆进行全面搜索。你必须完全搜索的车辆数量现在应该只是所有车辆的一小部分。当然,这种策略的效率取决于你的战士的分布。如果他们中的50%位于某个城市的某个地方,这将无法运作,但假设一个地方最大的车辆组合为5-10%,则应该提高性能。