MySQL中大圆距离的计算与分组
我有两张桌子,其中一张大致如下:MySQL中大圆距离的计算与分组,mysql,sql,Mysql,Sql,我有两张桌子,其中一张大致如下: client_ip server_ip speed --------- --------- ----- 1.2.3.4 9.1.2.3 100 1.2.3.5 9.1.2.3 1033 还有一个有地理数据: ip latitude longitude ------- -------- --------- 1.2.3.4 13.75 100.21 1.2.3.5 21.1234 1
client_ip server_ip speed
--------- --------- -----
1.2.3.4 9.1.2.3 100
1.2.3.5 9.1.2.3 1033
还有一个有地理数据:
ip latitude longitude
------- -------- ---------
1.2.3.4 13.75 100.21
1.2.3.5 21.1234 141.21
9.1.2.3 13.75 99.21
我想写一个select查询,计算两个IP地址之间的大圆距离,按它分组,并计算平均速度。例如,理想的输出是:
distance avg(speed)
-------- ----------
21 99
100 1234
虽然我知道在SQL中获得大圆距离是有困难的,但对于如何有效地连接这两个表,我的头脑有点模糊,因为这两个表都是相当大的数百万行
有什么建议吗?假设地理数据表中的IP是唯一的,它实际上不是一个非常昂贵的连接。即使您是从服务器ip列中具有非唯一值的表进行连接,也不必告诉系统这是一个外部连接-对于速度表中的每一行,ip表中将有一个且只有一个条目与客户端ip匹配,ip表中将有一个且只有一个条目与服务器ip匹配。因此,可以毫无困难地使用内部联接
SELECT <c.client_ip to s.server_ip distance calc> AS Distance, AVG(sp.speed) AS AvgSpeed
FROM speedTable sp JOIN geoTable c
ON sp.client_ip = c.client_ip JOIN geoTable s
ON sp.server_ip = s.server_ip
WHERE 1 = 1 --whatever your where clause is
GROUP BY <c.client_ip to s.server_ip distance calc>
嗯,连接可能不是这个查询的慢部分,它将是每行上的距离计算
SELECT
client_ip,
server_ip,
avg(speed),
{your distance calculation} AS distance
FROM
speeds
JOIN geo AS geo_client ON geo_client.ip=speeds.client_ip
JOIN geo AS geo_server ON geo_server.ip=speeds.server_ip
GROUP BY
distance
这是您的连接,但是请注意,距离计算是在每一行上完成的,有数百万行,您将在那里获得巨大的成功。你可以尝试一些东西,也许可以看看其他的帖子:
您真的想要检索所有这些结果行,还是只对最短路径或最长路径感兴趣。因为比较距离比实际计算距离要便宜。例如,您可以将球体上的角度转换为三维坐标,并使用这些坐标简单地比较距离,即直接直线代替测地线=大圆段。