Tag: 地理信息

PHP / MySQL中的地理search(距离)(性能)

我有一个MySQL表(MyISAM),其中包含大约200k条经纬度/长对,根据来自另一个纬度/长度对的距离(大圆公式)select。 (例如,在50.281852,2.504883附近的10km范围内的所有条目) 我的问题是,这个查询大约需要0.28秒。 只为那些200k条目运行(每天继续获得更多)。 虽然0,28秒 通常会很好,这个查询运行的频率非常高,因为它支持我的web应用程序的主要function,而且通常是更大查询的一部分。 有什么办法可以加速吗? 显然,MySQL必须每次运行所有200k条目,并为每个条目执行大圆公式。 我在这里阅读了一些关于geohashing,R-Trees之类的东西,但是我不认为这是我想要去的方式。 部分原因是我从来没有成为一个math迷,但主要是因为我认为这个问题已经被图书馆/扩展等比我聪明的人解决了。 已经过广泛的testing,并且正在定期更新。 MySQL似乎有一个空间扩展,但没有提供一个距离函数。 我应该看另一个数据库来把这个坐标对? PostgreSQL似乎有一个相当成熟的空间扩展。 你知道吗? 或者,PostgreSQL也只是简单地使用大圆圈公式来获取特定区域内的所有条目? 有可能是一个专门的独立产品或MySQL的扩展已经做了我在找什么? 或者可能有一个PHP库,我可以用来做计算? 使用APC,我可以很容易地把经纬度对放入内存(这些200k条目大约需要5MB),然后在PHP中运行查询。 然而,这种方法的问题是,那么我会有一个MySQL查询像SELECT .. FROM .. WHERE id(id1,id2,..)所有的结果至多可以达到几千。 MySQL如何处理这些查询? 然后(因为这是一个数字处理任务)会这样做在PHP中足够快? 任何其他的想法我应该/不应该做什么? 完整版,这里是示例查询,剥离了任何不相关的部分(正如我所说,通常这是一个更大的查询,我join了多个表的一部分): SELECT id, 6371 * acos( sin( radians( 52.4042924 ) ) * sin( radians( lat ) ) + cos( radians( 50.281852 ) ) * cos( radians( lat […]