我的问题是,仅仅为了这200k个项目(每天都在增加),这个查询就需要大约0.28秒才能运行。通常情况下,0.28秒是可以接受的,但由于该查询经常运行且作为Web应用程序主要功能的一部分,因此它可能会成为更大查询的一部分。
有没有什么方法可以提高速度?显然,MySQL必须每次遍历所有200k个条目,并针对每个条目执行大圆公式。我在Stack Overflow上读到了一些关于地理散列、R-Tree等方面的内容,但我不认为那是我想走的路。部分原因是因为我从未是数学的忠实拥护者,但主要是因为我认为这个问题已经被某位比我聪明的人在一个被广泛测试和定期更新的库/扩展程序中解决了。
MySQL似乎有一个空间扩展,但它并没有提供距离函数。我应该寻找另一个数据库来存储这些坐标对吗? PostgreSQL似乎有一个相当成熟的空间扩展。你了解它吗? 或者PostgreSQL也会像MySQL一样使用大圆公式来获取某个区域内的所有条目吗?
也许已经有一个专门的独立产品或mysql扩展程序可以完成我所需要的功能吗?
或者有没有我可以用来计算的PHP库?使用APC,我可以轻松地将纬度-经度对适合到内存中(这200k个条目大约占用5MB),然后在PHP中运行查询。然而,这种方法的问题是,然后我会有一个类似于“SELECT .. FROM .. WHERE id in (id1, id2, ..)”的MySQL查询语句,针对所有结果,可能最多有几千条。MySQL处理这些查询的能力如何?(因为这是一个数值计算任务)用PHP执行这个任务足够快吗?
还有什么其他的建议或不建议?
为完整起见,这里是示例查询,剔除了任何不相关的部分(正如我所说,通常这是多个表连接的一部分):
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