从另一个表 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 更新地理信息的主要内容,如果未能解决你的问题,请参考以下文章