【问题标题】:Update geographical info from another table MySQL从另一个表 MySQL 更新地理信息
【发布时间】:2015-04-11 16:37:12
【问题描述】:

祝大家今天好,

我在构建以下更新时遇到性能问题:

表 POI(兴趣点)包含 1000 万条记录,其中包含经度和纬度字段(摘自 Planet OSM)

表 City 包含世界上大多数城市的 145,000 条记录,还包含经度和纬度字段

我想将POI表中的外键City_ID(该字段中还没有数据)关联到city表中的主ID。完成后,我将能够将我所有的 POI 与一个城市相关联。我尝试过反向地理编码,但事实证明这是一次糟糕的体验,我不知道如何对 1000 万条记录进行反向地理编码,因此我敢打赌,选择离每个 POI 最近的城市。但似乎我的 SQL 查询在我全新的 16 gigs 或 RAM 的 Macbook Pro 2015 上永远存在。我在这里没有做一些事情......所有经纬度字段都在 MySQL 数据库中编制索引

我已经尝试了以下查询:

update poi
set (poi.city_ID, poi.distance) = 

(    select city.ID,
      MIN(111.045* DEGREES(ACOS(COS(RADIANS(poi.latitude))
                 * COS(RADIANS(city.latitude))
                 * COS(RADIANS(poi.longitude) - RADIANS(city.longitude))
                 + SIN(RADIANS(poi.latitude))
                 * SIN(RADIANS(city.latitude))))) AS distance_in_km
     FROM city 
)

暂停!

干杯

标准。

【问题讨论】:

    标签: mysql geolocation geocoding openstreetmap


    【解决方案1】:

    在存储为浮点数的两个单独的 lat 和 lon 列上建立索引没有帮助。您需要利用数据库的空间特征,将纬度/经度位置存储在地理类型的单个列中,并在该列上创建空间索引。有关 MySQL 空间特性的详细信息,请参阅article

    【讨论】:

    • 似乎为了使用空间特征,我需要通过以下命令将我的表从 Innodb 转换为 MyIsam:ALTER TABLE poi ENGINE=MYISAM;但是该死的桌子留在 Innodb 上?什么???或者我可以从 MySQL 5.6 升级到 5.7 以使用 InnoDB 具有空间功能。不确定 5.7 是否稳定...
    • 好的......我在这里做点什么! :) 我对我的表做了以下操作:在 poi(纬度,经度)上创建索引 idxfaster;并在 poi(经度)上创建索引 idxfasterlong;我还在查询(边界框)中添加了一些“WHERE”。查询从 3 秒变为……(鼓声)0.3 秒!!!是的!
    • 愚蠢的我......更新语句没有花费 o.3 秒!我只是用一个简单的选择和一对硬编码的经度和纬度来查询表,看看一个查询需要多长时间:) 我现在将尝试更新。敬请期待
    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多