数据库/ SQL:如何存储经度/纬度数据?
性能问题…
我有一个有地理位置数据(经度和纬度)的房屋数据库。
我想要做的是find使用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中存储经纬度数据并分离出经度/纬度的最好方法吗? 如果不是,那是什么? 作为数据types,存在Float,Decimal和Spatial。
- 从性能angular度来看,这是执行SQL的最佳方式吗? 如果不是,那是什么?
- 使用不同的MySQL数据库引擎是否有意义?
更新:仍然没有答案
下面我有3个不同的答案。 一个人说使用Float
。 一个人说使用INT
。 一个人说使用Spatial
。
所以我用MySQL“EXPLAIN”语句来衡量SQL的执行速度。 如果对经度和纬度数据types使用INT
或FLOAT
,那么SQL执行(结果集取回)完全没有区别。
它也似乎使用“ BETWEEN
”语句比使用“ >
”或“ <
”SQL语句显着更快。 使用“ BETWEEN
”的速度比使用“ >
”和“ <
”语句快3倍。
这样说的话,我仍然不清楚如果使用Spatial会对性能产生什么影响,因为我不清楚它是否支持我运行的MySQL版本(v5.0.24)…以及如果支持。
任何帮助将大大appreacited
浮动(10,6)就好了。
任何其他复杂的存储scheme将需要更多的翻译和浮点数,而且浮点数运算速度很快。
我知道你在问MySQL,但是如果空间数据对你的业务很重要,你可能需要重新考虑。 PostgreSQL + PostGIS也是免费软件,在pipe理空间和地理数据方面有很高的声誉。 很多人只是因为PostGIS才使用PostgreSQL。
我不太了解MySQL空间系统,所以对于你的用例来说,它可能已经足够了。
在这里使用任何其他数据types而不是“空间”的问题是,你的“矩形select”可以(通常,这取决于你的数据库是多么明亮 – 而MySQL一般不是最亮的)只能在一个单一维度。
系统可以select经度指数或纬度指数,并使用它来减less要检查的行集。 但是在完成之后,可以select:(a)获取所有find的行并对其进行扫描并testing“其他维度”,或者(b)在“其他维度”上进行类似的过程,然后匹配这两个结果集来查看哪些行出现在两者中。 后一个选项可能不会在您的特定DBMS引擎中实现。
空间索引类似于后者“自动”,所以我认为在任何情况下,空间索引都能提供最好的性能是安全的,但也可能是这样的情况,它并没有显着地超越其他解决scheme,这是不值得的麻烦。 这取决于各种各样的东西,如在您的实际数据等的数量和分布等。
浮点(树)索引肯定比整数索引要慢,因为在浮点上执行'>'比在整数上执行'>'要花费的时间要长。 但是如果这个效果真的很明显,我会感到惊讶。
我将它存储为整数( int
,4字节),以1/1000000度表示。 那会给你几英寸的分辨率。
我不认为在MySQL中有任何内在的空间数据types。
浮动(10,6)
经纬度5555.123456?
你不是说Float(9,6)吗?
Google在其“Store定位器”示例中使用浮点数(10,6)。 这对我来说就足够了。
https://stackoverflow.com/a/5994082/1094271
此外,从MySQL 5.6.x开始,空间扩展支持在function和性能方面要好得多,可以与PostGIS相媲美。
我发现这个答案有用,也许它可以帮助你吗?: 问题在MySQL数据库中存储纬度和经度值
我有完全相同的模式(浮动(10,6))和查询(在矩形内select),我发现将数据库引擎从innoDB切换到myisam在表中的“点矩形查找”的速度加倍有78万条logging。
此外,我将所有的lng / lat值转换为笛卡尔整数(x,y),并在x,y上创build了一个双列索引,我的速度从〜27 ms变为1.3 ms。
这真的取决于你如何使用数据。 但是,对事实的粗略过度简化,在小数点上小数更快但不太准确。 更多信息:
http://msdn.microsoft.com/en-us/library/aa223970(SQL.80).aspx
此外,GPS坐标标准在ISO 6709: