我有一个MySQL表(MyISAM),包含我从中选择的大约200k个纬度/长对条目,基于来自另一个纬度/长对的对距离(大圆公式).(例如,半径10公里范围内的所有条目,大约在50.281852,2.504883)
我的问题是这个查询大约需要0.28秒.只运行那些200k条目(每天继续获得更多).虽然0,28秒.通常很好,这个查询经常运行,因为它支持我的web-app的主要功能,并且通常它是更大查询的一部分.
有什么方法可以加快速度吗?显而易见,MySQL必须每次都运行所有200k条目,并为每个条目执行大圆公式.我在stackoverflow上读到了关于geohashing,R-Trees之类的东西,但我认为这不是我想要的方式.部分是因为我从未成为数学的忠实粉丝,但主要是因为我认为这个问题已经由比我更聪明的人在图书馆/扩展/等中解决了.经过广泛测试并定期更新.
MySQL似乎具有空间扩展,但是它不提供距离函数.我应该查看另一个数据库来放置这个坐标对吗?PostgreSQL似乎有一个相当成熟的Spatial扩展.你对此有所了解吗?或者PostgreSQL也只是使用大圆公式来获取某个区域内的所有条目?
是否有专门的独立产品或mysql扩展已经完成了我正在寻找的东西?
或者是否可以使用我可以用来进行计算的PHP库?使用APC我可以很容易地将lat-long对装入内存(那些200k条目大约需要5MB),然后在PHP内部运行查询.然而,这种方法的问题是,我有一个MySQL查询,如SELECT .. FROM .. WHERE id in(id1,id2,..),所有结果都可以达到几千.MySQL如何处理像这样的查询?然后(因为这是一个数字运算任务)在PHP中这样做会足够快吗?
任何其他想法我应该/不应该做什么?
对于completenes,这里是示例查询,删除任何不相关的部分(正如我所说,通常这是我加入多个表的更大查询的一部分):
SELECT id, 6371 * acos( sin( radians( 52.4042924 ) ) * sin( radians( lat ) ) + cos( radians( 50.281852 ) ) * cos( radians( lat ) ) * cos( radians( 2.504883 ) - radians( lon ) ) ) AS dst
FROM geoloc
HAVING dst <10
ORDER BY dst ASC
Run Code Online (Sandbox Code Playgroud)
谢谢!