mysql - 使用 INNER join 的 SQL 查询花费的时间太长

标签 mysql sql

我有一个数据库,我在其中保存抓取的代理,然后不断检查它们,问题是我有一个使用指定过滤器计算代理总数的函数,例如:来自美国的 HTTP 代理至少有 70% 的正常运行时间大约需要 4 - 5 秒,虽然时间不是很多,但用户这次已经等不及更新计数器了。

为了过滤所有代理,在本例中我使用了 2 个表 名为代理的表,在这里我插入带有一般信息、ISP、国家/地区、协议(protocol)等的代理

CREATE TABLE `proxies` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `ip` varchar(255) NOT NULL,
 `port` varchar(255) NOT NULL,
 `ishttp` varchar(255) NOT NULL,
 `ishttps` varchar(255) NOT NULL,
 `issocks4` varchar(255) NOT NULL,
 `issocks5` varchar(255) NOT NULL,
 `country` varchar(255) NOT NULL,
 `city` varchar(255) NOT NULL,
 `isp` varchar(255) NOT NULL,
 `ismobile` varchar(10) NOT NULL,
 `isdetected` varchar(10) NOT NULL,
 `date_added` varchar(255) NOT NULL,
 `last_checked` varchar(255) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7981 DEFAULT CHARSET=latin1

和名为 http 的表,这里我只插入 http 代理,并保存正常运行时间、失败的检查、平均 ping 等(代理在两个表中都是重复的,我的意思是,如果代理是 HTTP,则转到代理并且http)

CREATE TABLE `http` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `ip` varchar(20) NOT NULL,
 `port` varchar(10) NOT NULL,
 `total` int(11) NOT NULL,
 `successful` int(11) NOT NULL,
 `failed` int(11) NOT NULL,
 `last_successful` varchar(255) NOT NULL,
 `last_failed` varchar(255) NOT NULL,
 `uptime` varchar(255) NOT NULL,
 `last_response` varchar(255) NOT NULL,
 `response_sum` varchar(255) NOT NULL,
 `avg_response` varchar(255) NOT NULL,
 `anonimity` varchar(20) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3776 DEFAULT CHARSET=latin1

实际上,为了过滤我用户 INNER JOIN 的代理, 这是一个例子:

SELECT * FROM http INNER JOIN 代理 ON http.ip=proxies.ip WHERE ishttp='yes' AND Country='USA' AND uptime >= '50'

这只是一个例子,用户可以按匿名(http.anonimity)、国家/地区(proxies.country)、正常运行时间(http.uptime)、ping(http.avg_response)、仅移动代理(proxies.ismobile)和仅通过代理(proxies.isDetected)

我还想补充一点,计数器会使用 JS 进行更新(意味着系统执行查询),并且每次用户修改表单中的任何值时

最佳答案

查询优化的关键方面是过滤条件。最有选择性的似乎是:第一个 proxies.country,第二个 proxies.ishttp

因此我将创建以下索引:

create index ix1 on proxies (country, ishttp);

create index ix2 on http (ip, uptime);

关于mysql - 使用 INNER join 的 SQL 查询花费的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56819771/

相关文章:

MySQL 奇怪的四舍五入结果

SQL 查询以查找具有最匹配关键字的行

php - SQL UPDATE 查询出错

mysql - 找不到文件 '/var/www/cms/numbers/numberswithnatinality.csv'(错误代码 : 13)

mysql - 如何在 COBOL 程序中传输收集的用户输入并存储在 SQL 表中?

python - 如何解决mysql每日分析在日期变化时发生的问题

mysql - 使用 MyISAM 表进行 Rails 单元测试

mysql - 从 MySQL 表中删除重复行

mysql - 将 4 个表连接在一起

mysql - 使用聚合函数的结果更新 mySQL 表