问题背景
随着数据越来越多,原本的SQL查询变得越来越慢,用户体验特别差,因此需要对SQL进行优化。
这个SQL查询关联两个数据表,一个是攻击IP用户表主要是记录IP的信息,如第一次攻击时间,地址,IP等等,一个是IP攻击次数表主要是记录每天IP攻击次数。而需求是获取某天攻击IP信息和次数。
(以下SQL语句测试均在测试服务器上上,正式服务器的性能好,查询时间快不少。)
环境准备
查看表的行数:
表名
行数
blacklist_attack_ip
35074971
blacklist_ip_count_date
15442993
未优化前SQL语句为:
SELECT
attack_ip,
country,
province,
city,
line,
info_update_time AS attack_time,
sum( attack_count ) AS attack_times
FROM
`blacklist_attack_ip`
INNER JOIN `blacklist_ip_count_date` ON `blacklist_attack_ip`.`attack_ip` = `blacklist_ip_count_date`.`ip`
WHERE
`attack_count` > 0
AND `date` BETWEEN