Database/SQL:如何存储经度/纬度数据?

69 mysql sql database performance sqlperformance

表现问题......

我有一个拥有地理定位数据(经度和纬度)的房屋数据库.

我想要做的是找到使用InnoDB数据库引擎将位置数据存储在我的MySQL(v5.0.24a)中的最佳方法,以便我可以执行大量查询,其中我将返回所有之间的所有主记录x1和x2 latitude以及y1和y2 longitude.

现在,我的数据库架构是

---------------------
Homes   
---------------------
geolat - Float (10,6)
geolng - Float (10,6)
---------------------
Run Code Online (Sandbox Code Playgroud)

我的疑问是:

SELECT ... 
WHERE geolat BETWEEN x1 AND x2
AND geolng BETWEEN y1 AND y2
Run Code Online (Sandbox Code Playgroud)
  • 我上面描述的是使用Float(10,6)存储纬度和经度数据并分离出经度/纬度的最佳方法吗?如果不是,那是什么?存在Float,Decimal甚至Spatial作为数据类型.
  • 这是从性能角度执行SQL的最佳方法吗?如果不是,那是什么?
  • 使用不同的MySQL数据库引擎是否有意义?

更新:仍然没有答案

我在下面有3个不同的答案.一个人说要用Float.一个人说要使用INT.一个人说要使用Spatial.

所以我使用MySQL"EXPLAIN"语句来衡量SQL的执行速度.如果使用INTFLOAT用于经度和纬度数据类型,似乎绝对没有SQL执行(结果集提取)的差异.

使用" BETWEEN"语句似乎比使用" >"或" <"SQL语句要快得多.使用" BETWEEN"比使用" >"和" <"语句快近3倍.

话虽如此,我仍然不知道如果使用Spatial会对性能产生什么影响,因为我不清楚它是否支持我运行的MySQL版本(v5.0.24)......以及我如何支持它如果支持.

任何帮助都会受到极大的欢迎

ric*_*ent 29

漂浮(10,6)就好了.

任何其他复杂的存储方案都需要更多的转换和转换,浮点数学运算速度非常快.

  • +1阅读http://coordinate.codeplex.com/,其中Jaime Olivares解释为什么浮点数是坐标的正确类型... (4认同)

Jef*_*vis 11

我知道您在询问MySQL,但如果空间数据对您的业务很重要,您可能需要重新考虑.PostgreSQL + PostGIS也是免费软件,在高效管理空间和地理数据方面享有盛誉.许多人仅因为PostGIS而使用PostgreSQL.

我对MySQL空间系统了解不多,所以也许它对你的用例来说效果不错.


小智 6

使用除"空间"之外的任何其他数据类型的问题在于,您的"矩形选择"类型(通常,这取决于您的DBMS有多亮 - 而且MySQL当然不是最亮的)只能在一个中进行优化单一维度.

系统可以选择经度索引或纬度索引,并使用它来减少要检查的行集.但在完成之后,可以选择:(a)获取所有找到的行并扫描这些行并测试"其他维度",或者(b)在"其他维度"上执行类似的处理,然后再执行匹配这两个结果集以查看哪两行都出现.后一个选项可能无法在您的特定DBMS引擎中实现.

空间索引有点"自动"地执行后者,所以我认为可以说空间索引在任何情况下都会提供最佳性能,但也可能是它没有明显优于其他解决方案的情况,这是不值得的麻烦.这取决于各种事物,如实际数据的数量和分布等.

毫无疑问,float(树)索引必然比整数索引慢,因为浮点数执行'>'的时间通常比整数更长.但如果这种影响真的很明显,我会感到惊讶.


ZZ *_*der 5

我将它存储为int以1/1,000,000度表示的整数(,4字节).这会给你几英寸的分辨率.

我认为MySQL中没有任何内在的空间数据类型.


kou*_*ton 5

Google在其“商店定位器”示例中使用了float(10,6)。这足以让我接受。

/sf/answers/419585771/

同样,从MySQL 5.6.x开始,空间扩展支持要好得多,并且在功能和性能上可与PostGIS相媲美。


Aye*_*xeM 0

这实际上取决于您如何使用数据。但在对事实的严重过度简化中,十进制速度更快,但近似值不太准确。更多信息请点击这里:

http://msdn.microsoft.com/en-us/library/aa223970(SQL.80).aspx

另外,ISO 6709 中指定了 GPS 坐标的标准:

http://en.wikipedia.org/wiki/ISO_6709