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

绩效问题。

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

我想要做的是找到最好的方法,使用 InnoDB 数据库引擎在我的 MySQL (v5.0.24 a)中存储位置数据,这样我就可以执行大量查询,返回所有在 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 中的数据,并分离出经度/纬度?如果不是,那是什么?存在浮点数、十进制数甚至空间数据类型。
  • 这是执行 从性能的角度来看,SQL 是什么?
  • 使用不同的 MySQL 数据库引擎有意义吗?

更新: 仍然没有回应

我有三个不同的答案。一个人说用 Float。一个人说用 INT。一个人说用 Spatial

因此,我使用 MySQL“ EXPLAIN”语句来测量 SQL 的执行速度。如果对经纬度数据类型使用 INTFLOAT,那么 SQL 执行(结果集获取)似乎完全不存在差异。.

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

尽管如此,我仍然不确定如果使用 Space 会对性能产生什么影响,因为我不清楚我的 MySQL 版本(v5.0.24)是否支持它... ... 以及如果支持它,我如何启用它。

如能提供任何帮助,我将不胜感激

85384 次浏览

我将它存储为整数(int,4字节) ,以1/1,000,000次方度表示。这样就能得到几英寸的分辨率。

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

这实际上取决于您如何使用数据。但是在对事实的粗略过度简化中,十进制更快,但是在近似值上不那么精确。更多信息请点击:

Http://msdn.microsoft.com/en-us/library/aa223970(sql.80).aspx

此外,GPS 坐标的标准在 ISO6709中有明确规定:

Http://en.wikipedia.org/wiki/iso_6709

Float (10,6)就可以了。

任何其他复杂的存储方案都需要更多的进出转换,而浮点数学就足够快了。

这里使用“空间”以外的任何其他数据类型的问题在于,您的“矩形选择”类型(通常取决于您的 DBMS 的亮度—— MySQL 通常不是最亮的)只能在一个维度中进行优化。

系统可以选择经度索引或纬度索引,并使用它来减少要检查的行集。但是在这样做之后,有一个选择: (a)获取所有找到的行并扫描这些行并测试“另一个维度”,或者(b)在“另一个维度”上做类似的处理,然后匹配这两个结果集以查看哪些行同时出现在两个维度中。后一个选项可能不会在您的特定 DBMS 引擎中以这种方式实现。

空间索引在某种程度上“自动”执行后者,所以我认为可以肯定地说,空间索引在任何情况下都会提供最佳性能,但也有可能它的性能并不明显优于其他解决方案,因此不值得费心。这取决于各种各样的事情,比如实际数据的体积和分布等等。

当然,float (tree)索引必然比整数索引慢,因为在 float 上执行’>’通常比在整数上执行时间更长。但如果这种效果真的明显,我会感到惊讶。

我知道你在问关于 MySQL 的问题,但如果空间数据对你的业务很重要,你可能需要重新考虑一下。PostgreSQL + 邮政地理信息系统也是免费软件,它们在有效管理空间和地理数据方面享有很高的声誉。许多人使用 PostgreSQL 仅仅是因为 PostGIS。

不过,我对 MySQL 空间系统了解不多,所以也许它对于您的用例来说已经足够好了。

浮动(10,6)

纬度或经度5555.123456在哪里?

你不是想说 Float (9,6)吗?

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

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

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

我有完全相同的模式(float (10,6))和查询(在一个矩形中选择) ,我发现将 db 引擎从 injDB 切换到 myisam 的速度提高了一倍,在一个有780,000条记录的表中,“在矩形中查找点”的速度提高了一倍。

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

我知道你可能已经忘记这个问题了。我只是想为这个问题添加另一种方法,以防有人想要存储地理定位数据。 你可以把经纬度信息编码成地理信息。因为它们的前缀可以搜索到所需的精度。似乎可以将查询转换为起始和结束前缀,并使用 LIKE查询进行前缀搜索。