数据库/ SQL:如何存储经度/纬度数据?
性能问题...
我有一个有地理位置数据(经度和纬度)的房屋数据库。
我想要做的是找到使用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)支持......以及如果支持。
任何帮助将大大appreacited
浮动(10,6)就好了。
任何其他复杂的存储方案都需要更多的翻译和浮点数,而且浮点数学运算速度很快。
我知道你在问MySQL,但是如果空间数据对你的业务很重要,你可能需要重新考虑。 PostgreSQL + PostGIS也是免费软件,它们在管理空间和地理数据方面非常有名。 许多人只是因为PostGIS才使用PostgreSQL。
虽然我对MySQL空间系统知之甚少,但对于您的用例来说,它可能已经足够了。
在这里使用除“空间”以外的任何其他数据类型的问题是,您的类型“矩形选择”可以(通常,这取决于您的DBMS的亮度 - 而且MySQL一般不是最亮的)只能在一个单一维度。
系统可以选择经度指数或纬度指数,并使用它来减少要检查的行集。 但是在完成之后,可以选择:(a)获取所有找到的行并对其进行扫描并测试“其他维度”,或者(b)在“其他维度”上执行类似的过程,然后匹配这两个结果集以查看哪些行出现在两者中。 后一个选项可能不会在您的特定DBMS引擎中实现。
空间索引对后者“自动”进行排序,所以我认为可以肯定的是,空间索引在任何情况下都能提供最佳性能,但也可能出现这种情况,它并没有显着地超越其他解决方案,并且这是不值得的麻烦。 这取决于各种各样的东西,如实际数据的量和分布等等。
float(tree)索引肯定比整数索引慢,因为在浮点上执行'>'比在整数上执行'>'要花费的时间要长。 但如果这种效果真的引人注意,我会感到惊讶。
链接地址: http://www.djcxy.com/p/93905.html上一篇: Database/SQL: How to store longitude/latitude data?
下一篇: ordinates (longitude/latitude, from Google Maps) in SQL Server?