我有房地产申请,“房子”包含以下信息:
house:
- house_id
- address
- city
- state
- zip
- price
- sqft
- bedrooms
- bathrooms
- geo_latitude
- geo_longitude
我需要对 地理坐标框 内的所有住宅执行极其快速(低延迟)检索。
类似下面的SQL(如果我使用数据库):
SELECT * from houses
WHERE latitude IS BETWEEN xxx AND yyy
AND longitude IS BETWEEN www AND zzz
问题:对于我来说,存储此信息的最快方式是什么,以便我可以根据纬度和数据执行最快速的数据检索。经度? (例如数据库,NoSQL,内存缓存等)?
答案 0 :(得分:1)
这是地理信息系统(GIS)应用程序的典型查询。其中许多是通过使用四叉树或类似的空间索引来解决的。提到的平铺是如何最终实现的。
如果包含坐标的索引可以放入内存并且DBMS有一个不错的优化器,则表扫描可以提供与任何感兴趣点的笛卡尔距离,并且开销相当低。如果这太慢,那么可以通过在进行全距离计算之前单独比较每个坐标轴来预过滤查询。
答案 1 :(得分:0)
ThereMongoDB支持地理空间索引,但有一些方法可以减少这类事情的计算时间。根据数据的排列方式,您可以将房屋放置在可识别的“瓷砖”中,然后获取给定瓷砖的所有房屋,并根据缩小的数据集,根据您所拥有的任何坐标的距离进行排序。
根据有多少个图块,您可以使用位掩码查找可能靠近或重叠多个图块的房屋。
答案 2 :(得分:0)
我将假设您执行的操作比写入更多,并且您不需要将数据库分布在数十台计算机上。如果是这样,你应该选择读取优化的数据库,如sqlite(我的个人喜好)或mysql,并使用你建议的SQL查询。
对于这类查询,大多数(并非所有)NoSQL数据库最终都过于复杂,因为他们更擅长在索引而不是范围中查找确切的值。
很高兴您正在寻找一个边界盒而不是笛卡尔距离;后者对SQL数据库的优化会更加困难(尽管你可以将它缩小到边界框,然后进行较慢的笛卡尔距离计算)。