【问题标题】:Optimal column type for latitude and longitude on Rails and MySQLRails 和 MySQL 上经纬度的最佳列类型
【发布时间】:2011-09-15 03:43:46
【问题描述】:

我想知道在 MySQL + Rails 上存储纬度/经度的最佳列类型是什么。

  • 精度必须足以存储从移动设备和/或地理编码器获得的纬度/经度的每一位。
  • 为了获得最佳查询性能,存储要求应该最低。

来自谷歌官方文档:

http://code.google.com/apis/maps/articles/phpsqlajax_v3.html

使用当前的缩放功能 谷歌地图,你应该只需要 6 小数点后的精度位数。 为了保持所需的存储空间 至少你的桌子,你可以 指定 lat 和 lng 属性是大小为 (10,6) 的浮点数。 这将使字段存储 6 小数点后的位数,最多加 4 小数点前的数字,例如 -123.456789 度。

所以,实际上FLOAT(10,6) 是 Google 推荐的。

但是,在 Rails 3 中,似乎没有简单的方法可以在小数点后精确定义 FLOAT 列类型。例如,您可以使用原始 SQL 编写迁移,如下所示:

def self.up
  execute <<-SQL
  ALTER TABLE places
    ADD `lat` FLOAT(10,6),
    ADD `lng` FLOAT(10,6)
  SQL
  add_index :places, [ :lat, :lng ]
end

schema.rb 将如下所示:

t.float "lat", :limit => 10
t.float "lng", :limit => 10

缺少小数部分的精度。

在这里我可以看到几个选项:

  • 使用FLOAT(10,6) 以获得最佳生产性能,并且不要在开发时转储架构(例如rake db:test:load)。
  • 使用DECIMAL(10,6),Rails 支持,但需要6 个字节,是FLOAT 的1.5 倍(参见:http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html)。也许这是一个很好的妥协?
  • 使用DOUBLE,比谷歌要求的空间大很多,占用8个字节,是FLOAT的2倍。也很简单。

你有什么建议?

【问题讨论】:

    标签: mysql ruby-on-rails optimization geolocation latitude-longitude


    【解决方案1】:

    根据您要对数据执行的查询类型,您可能需要查看几何类型:

    http://dev.mysql.com/doc/refman/5.1/en/creating-a-spatially-enabled-mysql-database.html

    我不熟悉 RoR,但尤其是这一行:

    add_index :places, [ :lat, :lng ]
    

    ... 似乎表明您计划运行地理空间查询。如果是这样,该索引对于所有意图和目的都将毫无用处,因为 btree 索引对最近邻点搜索没有帮助。

    【讨论】:

    • 由于 InnoDB 不支持地理空间索引,我打算使用 Sphinx 进行地理空间查询。但正如您所指出的, (lat, lng) 上的索引似乎是一个坏主意 - 我将更多地研究几何类型。谢谢!
    • 或者,使用 PostgreSQL。它在 ACID 环境中提供了非常复杂的地理空间功能。
    【解决方案2】:

    KISS(即提交给框架),它不是很多字节。只有使用特定的索引才会更重要。

    【讨论】:

    • 是的,听起来不错。在我看来,将 Sphinx 的地理空间索引放在单独的机器上会很好,因为它不会占用 MySQL 硬件上的内存。
    猜你喜欢
    • 1970-01-01
    • 2018-01-27
    • 2010-09-27
    • 2021-06-08
    • 2011-11-08
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多