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

时间:2009-09-02 21:16:48

标签: sql mysql database performance sqlperformance

表现问题......

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

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

现在,我的数据库架构是

---------------------
Homes   
---------------------
geolat - Float (10,6)
geolng - Float (10,6)
---------------------

我的疑问是:

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

更新:仍无人接听

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

所以我用MySQL“EXPLAIN”语句来衡量SQL的执行速度。如果对经度和纬度数据类型使用INTFLOAT,则表明SQL执行(结果集提取)绝对没有区别。

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

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

任何帮助都会非常适合

9 个答案:

答案 0 :(得分:29)

float(10,6)就好了。

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

答案 1 :(得分:11)

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

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

答案 2 :(得分:6)

使用除“空间”之外的任何其他数据类型的问题是,您的“矩形选择”可以(通常,这取决于您的DBMS有多亮 - 而且MySQL肯定不是最亮的)只是在单一维度上进行优化。

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

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

浮点数(树)索引必然比整数索引慢,因为执行'&gt;'通常需要更长的时间。在浮点上比在整数上。但如果这种影响真的很明显,我会感到惊讶。

答案 3 :(得分:5)

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

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

答案 4 :(得分:5)

Google在其“商店定位器”示例中使用了float(10,6)。这对我来说已经足够了。

https://stackoverflow.com/a/5994082/1094271

此外,启动MySQL 5.6.x,空间扩展支持在功能和性能方面要比PostGIS好得多。

答案 5 :(得分:4)

  

浮动(10,6)

纬度或经度5555.123456在哪里?

你不是指Float(9,6)吗?

答案 6 :(得分:1)

我觉得这个答案很有用,也许它对你有帮助吗?:Problem Storing Latitude and Longitude values in MySQL database

答案 7 :(得分:1)

我有完全相同的模式(float(10,6))和查询(在矩形内选择),我发现将数据库引擎从innoDB切换到myisam会使矩形外观的速度加倍-up&#34;在一张包含780,000条记录的表格中。

此外,我将所有lng / lat值转换为笛卡尔整数(x,y)并在x,y上创建了一个双列索引,并且对于相同的查找,我的速度从~27 ms变为1.3 ms。

答案 8 :(得分:0)

这实际上取决于您使用数据的方式。但是,在事实的过度简化中,十进制更快,但在近似中不太准确。更多信息:

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

此外,GPS坐标的标准在ISO 6709中规定:

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