假设我有一个位置表(纬度,经度),我希望将指定范围内的所有位置都放到我当前的位置,我的问题更好:将计算包含在查询的where子句中,像select * from locations where /* formula of cosines and sines of the latitude and longitude */ < distance
我的第二选择是获取所有位置并在程序中进行本地计算。如果重要的话,我正在使用java和mysql
答案 0 :(得分:5)
根据计算的数据和复杂程度,您可以尝试执行两者的混合。使用更简单,更不精确但更便捷的计算(能够利用指数)来减少发送回最终处理的结果。
例如,如果标准是&#34;距离5英里&#34;,而不是执行涉及几何函数的等式;你可以计算一个边界框。检索该范围内的行,然后使用更复杂的函数排除&#34;角落#34;。
或者,如果您的服务器功能强大,并且预计客户端的计算速度相对较弱;最好将这些计算卸载到服务器上。
编辑:另一种可能性是将更复杂的计算放在HAVING子句中,将更简单的计算保留在WHERE中,这样只需要在传递更简单,更友好的索引的过滤器上执行。
Edit2:给出一个通用的例子(因为我不熟悉使用long和lat;你的方程式可能需要考虑全局&#34; wrap&#34;)。
SELECT *
FROM theTable
WHERE x BETWEEN [minX] AND [maxX]
AND y BETWEEN [minY] AND [maxY]
HAVING POW(x-[originX], 2) + POW(y-[originY], 2) <= POW([distance], 2)
;
答案 1 :(得分:1)
对于小型数据集,无论您如何执行查询。
对于大型数据集,无论哪种方式都有问题......
如果您获取所有数据,那么在客户端中进行工作,那就是大量的网络流量。还有很多计算。
如果你在SQL中检查距离,那就是在那里进行大量计算,并扫描整个数据集,除非......
如果限制行检查目标点周围的“方形”,则可以减少计算量。这需要INDEX(lat)
或INDEX(lng)
。唉,INDEX(lat, lng)
不帮助。
我已经解决了这个问题,并提出了一个涉及存储过程PARTITIONing
和迭代的复杂答案。但它(大多数)将自己局限于“方形”,因此对于大型数据集非常有效。解释和代码是here。
答案 2 :(得分:0)
您可以使用存储过程来最小化同一查询到服务器的流量。如果需要,您甚至可以在客户端浏览器上进行计算,并避免对系统进行任何计算。