Mysql - 在多边形内部管理和查找纬度经度点的最佳方法

时间:2016-06-21 03:05:46

标签: mysql geospatial spatial-query

在MySQL中管理纬度和经度数据库的最佳方法是什么?我有一个非常大的数据库包含餐厅的许多位置,我需要找到多边形内的餐馆(多边形尤其是矩形)?

例如我有数据库:

第1行: 纬度(-6.8374651) 经度(107.56283)

第2行: 纬度(-6.947151) 经度(108.261528)

第3行: 纬度(-9.125182) 经度(115.121831)

我在西北角有一个矩形:( - 6.4516,107.19281)和东南角:( - 6.81726,106.19271)

我的问题是如何以最有效的方式找到此矩形内的餐馆列表?我有5000万行数据,并且每天都会增加

PS。我已经为纬度和经度创建了一个索引,并试着像这样查询:

SELECT * FROM location WHERE latitude<=-6.4516 AND latitude>=-6.81726 AND longitude<=107.19281 AND longitude>=106.19271

但MySQL继续将其搜索到整个表并使查询变得如此缓慢

由于

1 个答案:

答案 0 :(得分:0)

MySQL有extensions for spatial data

您可以将点和其他空间对象存储在一个列中(毕竟,空间中的一个点是原子值,即使它看起来有一个X和Y组件),然后添加一个R-Tree数据的索引 - B树索引(例如您在数字数据类型列上找到的)不适合空间查询,因为对于范围内的每个X,必须评估每个可能的Y,即使是那些明显不相关的Y,因为B-Tree在列之间没有相关感 - 这两个值是串联存储的,如果你想要给定X的每个可能的Y,这是很好的,但是当这两个值描述空间中的一个点时是不合适的。

空间索引是二维的,基于最小边界矩形,因此感兴趣的“点”在索引中物理存储在一起。

在您有机会熟悉MySQL中的空间数据之前 - 这确实需要一些学习曲线 - 您可以通过为优化程序提供两种选择来优化现有结构:

ALTER TABLE location
  ADD KEY longest (longitude,latitude),
  ADD KEY latlong (latitude,longitude);

这有时会让优化器发现通过搜索lat然后长扫描,或者通过长扫描然后扫描lat来做更少的工作,并且在每种情况下,它应该比单个索引执行得更好,如果是你现在拥有什么。

此外,与所有查询的情况一样,请勿使用SELECT *。只选择您真正需要的列,因为这通常会为优化器提供更多选择,以便在减少工作量的同时查找数据。特别是,在这里,添加我建议的索引后,您可能会发现,与选择所有列相比,仅选择(id,纬度,经度)的速度比预期的要快。