2016-06-21 716 views
1

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

例如,我有数据库:

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

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

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

我有北西点的矩形:(-6.4516,107.19281)和东南亚点:(-6.81726,106.19271)

我的问题是如何找到这个矩形在最里面的餐馆列表高效的方式?我有五千万行的数据,并且每天都会增加。

PS。我已经创建了经度和纬度的指标,并尝试查询它是这样的:

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

但MySQL的保持它搜索到整个表,使查询变得如此缓慢

感谢

+0

如果矩形是固定的,只将坐标存储在其中。如果不是,请给出更多细节的要求。 –

+0

没有坐标是动态的,用户可以灵活地定义它在矩形和它有多大 –

回答

0

的MySQL有extensions for spatial data

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

基于最小边界矩形,空间索引是二维的,所以感兴趣的“点”在物理上更接近地存储在索引中。

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

直到你有机会熟悉MySQL中的空间数据 - - 这确实需要一个学习曲线,你可以在一定程度通过给优化器两种选择优化现有结构

这有时会允许优化器发现通过搜索lat然后扫描long或通过搜索long和scan lat可以做的工作量更少,并且在每种情况下,它应该比单独的索引执行得更好,如果这就是您现在有了。

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

相关问题