mysql - 我的 mySQL 查询是否尽可能高效?

标签 mysql

我有一个需要很长时间才能处理的 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/

相关文章:

mysql - 为什么 MariaDB 上的 CHECK 语句在 Windows 上有效,而在 Linux 上无效?

MYSQL 查询不允许时间戳列具有同一日期的两个值

mysql - 我应该使用什么来验证使用nodejs登录的用户

mysql - 表值设置为1或可以设置为默认1

mysql - 在 WHERE 子句中查询 XML 属性值

python - PyMySQL 频繁读取后抛出 'BrokenPipeError'

mysql - SQL 查询从以下情况的两个表中检索数据

javascript - 使用脚本定期执行mysql查询

MySQL/PHP 自动提示

php - 使用 PHP 脚本从 MySQL 数据库创建 XLS 文件