72

性能问题...

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

我想要做的是找到使用 InnoDB 数据库引擎将位置数据存储在我的 MySQL (v5.0.24a) 中的最佳方法,这样我就可以执行大量查询,返回介于两者之间的所有家庭记录x1 和 x2latitude以及 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 的执行速度。INT如果使用或FLOAT用于经度和纬度数据类型,则似乎在 SQL 执行(结果集获取)方面绝对没有区别。

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

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

任何帮助将不胜感激

4

8 回答 8

29

float(10,6) 很好。

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

于 2009-09-02T21:58:03.040 回答
11

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

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

于 2009-09-03T16:37:42.133 回答
6

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

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

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

确实,浮点(树)索引必然比整数索引慢,因为在浮点上执行“>”通常比在整数上执行的时间更长。但如果这种效果真的很明显,我会感到惊讶。

于 2009-09-03T13:45:14.300 回答
6

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

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

此外,从 MySQL 5.6.x 开始,空间扩展支持要好得多,在功能和性能上与 PostGIS 相当。

于 2013-05-04T09:58:44.277 回答
4

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

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

于 2009-09-02T21:33:51.403 回答
4

浮动 (10,6)

纬度或经度 5555.123456 在哪里?

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

于 2010-11-10T16:39:00.243 回答
2

我有完全相同的架构(float(10,6))和查询(在矩形内选择),我发现将数据库引擎从 innoDB 切换到 myisam 使表格中“矩形查找点”的速度加倍有 780,000 条记录。

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

于 2014-04-22T17:08:58.073 回答
0

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

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

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

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

于 2009-09-02T21:37:58.213 回答