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
这是您的连接,但是请注意,距离计算是在每一行上完成的,有数百万行,您将在那里获得巨大的成功。你可以尝试一些东西,也许可以看看其他的帖子:


您真的想要检索所有这些结果行,还是只对最短路径或最长路径感兴趣。因为比较距离比实际计算距离要便宜。例如,您可以将球体上的角度转换为三维坐标,并使用这些坐标简单地比较距离,即直接直线代替测地线=大圆段。