从另一个表 MySQL 更新地理信息

Posted

技术标签:

【中文标题】从另一个表 MySQL 更新地理信息【英文标题】:Update geographical info from another table 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 
)

暂停!

干杯

标准。

【问题讨论】:

【参考方案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 秒!我只是用一个简单的选择和一对硬编码的经度和纬度来查询表,看看一个查询需要多长时间:) 我现在将尝试更新。敬请期待

以上是关于从另一个表 MySQL 更新地理信息的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:从另一个表更新一个表中的 id 值

MYSQL从另一个表更新数据,如果存在,否则插入[重复]

如何从另一个表更新mysql pdo中的字段[重复]

MySQL 从另一个表连接和 COUNT(*)

仅当自动增量数据相等时才从另一个表列更新 mysql 列

MySQL:从另一个表中更新一个表中的id值