在MySQL中通过大圆距离进行计算和分组

时间:2013-01-23 20:56:30

标签: 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     141.21
9.1.2.3  13.75       99.21

我想编写一个选择查询来计算两个IP地址之间的大圆距离,按其分组,并计算平均速度。因此,例如,理想的输出将是:

distance  avg(speed)
--------  ----------
21        99
100       1234

虽然我知道在SQL中获得大圆距离有good resources out there,但我对如何有效地连接这两个表有点浑浊,因为两者都相当大(数百万行)。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

假设地理数据表中的IP是唯一的,它实际上并不是非常昂贵的连接。即使您从server_ip列中的非唯一值表中加入,也不必告诉系统它是外连接 - 对于“speed”表中的每一行,都会有一个,并且只有一个IP表中与client_ip匹配的条目,以及与server_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>

答案 1 :(得分:1)

好吧,连接可能不是这个查询的缓慢部分,它将是每行的距离计算...

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

有你的加入,但请注意距离计算是在每行上进行的,有数百万行,你会在那里受到重创。你可以尝试一些事情,也许看看其他帖子: