我有一个数据库,我在其中保存抓取的代理,然后不断检查它们,问题是我有一个使用指定过滤器计算代理总数的函数,例如:来自美国的 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/