我有一个需要很长时间才能处理的 mySQL 查询。我正在查询与国家代码相关的大量 IP 范围表,以发现 url_click 表中每个 IP 的原产国。 (IP数据库来自hxxp://ip-to-country.webhosting.info/)
虽然速度很慢,但效果非常好。
是否有更有效的方式来编写此查询?
表格和输出 JPG:http://tiny.cx/a4e00d
SELECT ip_addr AS IP, geo_ip.ctry, count(ip_addr) as count
FROM `admin_adfly`.`url_click`,admin_adfly.geo_ip
WHERE INET_ATON (ip_addr)
BETWEEN geo_ip.ipfrom AND geo_ip.ipto
AND url_id = 165
GROUP BY ip_addr;
最佳答案
在两个表之间的连接中使用函数会比普通连接慢,因此您可能希望尽可能长时间地推迟该特定操作。所以,我会总结数据然后加入它:
SELECT S.IP_Addr, G.Ctry AS Country, S.Count
FROM (SELECT ip_addr, COUNT(ip_addr) AS Count
FROM admin_adfly.url_click
WHERE url_id = 165
GROUP BY ip_addr) AS S
JOIN admin_adfly.geo_ip AS G
ON INET_ATON (ip_addr) BETWEEN geo_ip.ipfrom AND geo_ip.ipto;
如果您可以重新设计架构并要进行大量此类分析,请重新处理两个表之一,以便连接条件不需要使用 INET_ATON()。
据推测,您在 url_id
列上有一个索引;这是唯一能给您带来很多好处的方法。
关于mysql - 我的 mySQL 查询是否尽可能高效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6707447/