表现问题......
我有一个拥有地理位置数据(经度和纬度)的房屋数据库。
我想要做的是找到使用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
更新:仍无人接听
下面我有3个不同的答案。一个人说使用Float
。一个人说使用INT
。一个人说要使用Spatial
。
所以我用MySQL“EXPLAIN”语句来衡量SQL的执行速度。如果对经度和纬度数据类型使用INT
或FLOAT
,则表明SQL执行(结果集提取)绝对没有区别。
使用“BETWEEN
”语句似乎比使用“>
”或“<
”SQL语句要快得多。使用“BETWEEN
”比使用“>
”和“<
”语句快近3倍。
说到这一点,我仍然不知道如果使用Spatial会对性能产生什么影响,因为我不清楚它是否支持我运行的MySQL版本(v5.0.24)...以及我如何启用如果支持它。
任何帮助都会非常适合
答案 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中规定: